2017-07-18 7 views
1

:どういうわけかクローズファイルのpython

for proc in psutil.process_iter(): 
    if proc.name() == 'myprocess.exe': 
     opened = proc.open_files() 
     proc.kill() 
     for i in opened: 
      print(i.path) 
      io.FileIO(i.path).close() 
      print(io.FileIO(i.path).closed) 

:私のpythonを使用して、実行中のプロセスを強制終了し、それが開かれたすべてのファイルを閉じたいwin7の/ win10

:3.4

OS io.IOBase(i.path).close()は機能しません。

説明:

私のpythonでMicrosoft Wordを殺すしたいようなものだが、それは開いているいくつかのファイルを残します。そして私はこれらのファイルも閉じたいと思います。

Microsoft Wordは例です。これは、自己記述されたPythonのprogrammです。開いたファイルは、以下のとおりです。

  • フォント(.TTF)
  • clr.pyd
  • と.dll-S

がどのように私はこれらのファイルを閉じる必要がありますか?

+0

私はあなたの質問に答えを投稿しましたが、別の問題を解決しようとしていると思います。代わりにその問題を説明できると便利です。 – jszakmeister

+0

私は自動更新プログラムを作成したいと思います:プロセスを強制終了すると、すべてのファイルが削除され、新しいファイルが同じ順序でコピーされます。開かれたファイルがいくつかある場合は、それらを修復できません。 – picibucor

+0

一般的に、それは本当に難しい問題です。特に、Wordのようなものでは、ユーザーが積極的に有用なことを行っている可能性があります。データの一部しか書き出されていないため、作業を失ったり、面白い方法でファイルを破損させたりする可能性があります。そのようなものをうまく動作させるには、はるかに優れた戦略が必要です。それはStackOverflowの質問IMHOを超えています。 – jszakmeister

答えて

0

with文の構文を見てください。概要がありますhere

+1

これは間違いなく問題に役立つことはありません。別のプロセスファイルハンドルを閉じることは、ローカルプロセスのファイルオブジェクトを閉じることとはまったく異なります。 – jszakmeister

+0

@jszakmeisterそれから私は質問を誤解しているようです。私は、ファイルが 'with'構文を使ってプロセスによって開かれた場合、そのプロセスを終了すると(別のプロセスからでも)自動的にファイルハンドルがクリーンアップされるという印象を受けました。そうではないと言っていますか? – DatHydroGuy

+0

あなたはその時点で正しいです、それはここで起こっていることではありません。終了されるプロセスはPythonプロセスではありません(この例ではWordでした)。ポスターは、そのプロセスやその仕組みを制御することはできません。したがって、ローカルプロセス(他のプロセスでファイルハンドルを終了して閉じることを検討しているプロセス)について話しているように、応答があるように見えます。 'with'はいくつかの理由でこのケースでは役に立ちません(そのうちのいくつかは私の答えで概説されています)。ところで、私はあなたの答えを投票しなかった(他の誰かがそれをした)。違いを明確にしたかっただけです。 – jszakmeister

4

プロセスによって開かれたファイルを閉じる必要はありません。それは、automaticallyを行われます:プロセス内の任意の残りのスレッドを終了するためにマークされている

  • :プロセスを終了

    は、以下の結果を持っています。

  • プロセスによって割り当てられたリソースはすべて解放されます。
  • すべてのカーネルオブジェクトは閉じられています。
  • プロセスコードがメモリから削除されます。
  • プロセス終了コードが設定されています。
  • プロセスオブジェクトに信号が送信されます。

重要なビットは「すべてのカーネルオブジェクトが閉じています」です。開いているファイルハンドルごとに、関連付けられたカーネルオブジェクトがあります。実際にはハンドルとは異なり、数値からカーネルオブジェクトへのマッピングです。プロセスが終了すると、カーネルは関連するファイルハンドルやソケットなどを後にして閉じます。

また、独自のアプローチではいくつかの問題があります。まず、開いているファイルのリストは、その時点で開いていたスナップショットのみです。開いているファイルのリストを要求してプロセスを強制終了するまでの間に、プロセスはさらに多くのファイルをオープンしたり、クローズしたり削除したりできました。第二に、Pythonの3ドキュメントはので、この方法でそれを使用して、IOBASEのコンストラクタが公開されていないと言うことはwrongです:

クラスio.IOBase

すべてのI/Oクラスの抽象基本クラスバイトストリームに作用します。パブリックコンストラクタはありません。

通常、パスにはio.open()のようなものを使用します。これは3番目の問題につながります。一緒に仕事をしなければならないのはその道です。ファイルを閉じるには、本当にハンドルが必要です。これらのハンドルはプロセス固有です。これは、あるプロセスで0x5555AAAAが "file1.txt"に対応している可能性がありますが、別のプロセスでは "file2.txt"に対応しているかもしれないし、まったくファイルでもないかもしれません。したがって、カーネルハンドルを持っていても、 "この他のプロセスのコンテキストでこのハンドルを閉じる"という言い方は本当にありません。それはプロセスのいくつかのセキュリティ目標に違反します。また、実際にここでやっていることは、回り込んだり閉じたりする独自のハンドルを作成していることです(この場合は、オブジェクトが正しく作成されていないため、何もしません)。

ファイルがまだ保持されていても問題が解決しない場合は、処理が完了するまでに実際にプロセスが終了していない可能性があります。プロセスが使用していたファイルがある場合は、そのプロセスを終了してから、再度使用する必要があります。あなたはそれを行うためにpsutils.wait_procs()を使うことができるようです。

また、Windowsでは、ウイルス対策ツールが頻繁に侵入することがわかりました。それらは、アプリケーションによってアクセスされるオープンファイルを保持しています。実際にウィルススキャナがその処理を行っているときに、プロセスがまだそれらを保持しているように見えます。私はSubversionでこれを処理しなければならない事例を覚えています。コードはまだ存在しますtoday。だから、ちょっと待ってからもう一度やり直す必要があるかもしれません。

更新

Microsoft Wordは単なる一例です。これは、自己記述されたPythonのprogrammです。開いたファイルは、以下のとおりです。

  • フォント(.TTF)
  • clr.pyd
  • と.dll-S

がどのように私はこれらのファイルを閉じる必要がありますか?

答えは必要ありません。プロセスが実際に終了したことを確認してください。それは瞬間的な操作ではないので、実際にはファイルハンドルを保持したまま終了するまでには時間がかかります。

実際にプロセスが終了すると書かれていることを考えれば、はるかに良いアプローチはプロセスを起動し、作業をしてから正常に終了する方法を導入することだと思います。次に、subprocess.run()を使用してスクリプトを実行し、スクリプトが終了するまで待ちます。

2

私はMicrosoft Wordをpythonで殺したいのですが、ファイルを開いたままにしておきます。そして私はこれらのファイルも閉じたいと思います。

ここでは誤解があります。 killを使用してWordを終了すると、システムの観点からすべてのファイルが閉じられますが、ダーティークローズになります。 Wordが正常に終了すると、内部バッファーがフラッシュされ、一時ファイルがすべて削除され、ファイルはとしてクリーンとマークされます。クラッシュしたり突然終了したりすると、そのすべてのクリーニングは行われません。いくつかの変更がディスクに書き込まれず、一時ファイルがまだ残っているため、次の実行時に、ファイルが正常に閉じられていないため修復する必要があることを警告します。

ですから、にしたくないが Microsoft Wordを殺すが、に近いそれ、そのメインウィンドウにWM_QUITメッセージを投稿意味します。残念なことに、Pythonにはそれがきれいできちんとサポートされていません。 win32comモジュールhereでExcelを終了する例があります。 Wordの変換は、(テストされていないことに注意してください):

wd = win32com.client.Dispatch("Word.Application") 
wd.Quit() #quit word, as if user hit the close button/clicked file->exit. 
関連する問題