PythonベースのGUIアプリケーションからMS-Officeドキュメントを開始したいとします。私はサブプロセスモジュールを使ってコマンドラインを使用して、実行可能なアプリケーションをファイルにマッピングする不運な作業をWindowsにさせていますが、ファイルがネットワーク上のどこかですでに開かれている場合は自動的に失敗します。私は静かに失敗する代わりにメッセージボックスを与えることを好むだろう。ファイルの修正時間を変更せずにこのシナリオをどのように伝えることができますか?Windows上のPythonで別のアプリケーションがファイルを使用しているかどうかを確認する方法
0
A
答えて
1
ファイルの名前を現在の名前に変更することができます。別のアプリケーションがファイルを開いている場合、これはPermissionError例外で失敗します。それが失敗しなければ、それは完全な無操作です。したがって:
def start_file(file):
if os.path.exists(file):
try: os.rename(file, file) # This does NOTHING if the file is available, or fails.
except PermissionError: messagebox.showwarning('File in Use', 'The file appears to be already open. Sorry about that.')
else: subprocess.call(['start', '/B', file], shell=True)
else: messagebox.showwarning('Missing File', 'That files does not yet exist. Sorry about that.')
純粋主義者は、これは少なくとも一つの競合状態の対象となるが、ビューの人間が相互作用点から、それは問題の時間の99.999%を解決しないことを指摘します。残りの部分については、Billを責めます:
関連する問題
- 1. directshow、フィルタが別のアプリケーションで使用されているかどうかを確認する方法
- 2. Windows CMD:ファイルを使用しているアプリケーションを確認する
- 3. ネットワークアダプタがWindows上でリムーバブルかどうかを確認する方法
- 4. VSプロジェクトがWEBアプリケーションまたはWindowsアプリケーションに属しているかどうかを確認する方法
- 5. Windowsでバッチファイルを使用してポート80を使用できるかどうかを確認する方法xp
- 6. DLLが別のアプリケーションで使用されているかどうかを確認してください
- 7. 別のプログラムが開いているファイルがあるかどうかを確認
- 8. ファイルがクリップのあるディレクトリ内の別のファイルと等しいかどうかを確認する方法
- 9. Python gtk:コンボボックスが開いているかどうかを確認する方法?
- 10. ファイルがWindowsネットワーク共有にあるかどうかを確認する方法?
- 11. マイクロフォーマットを使用しているかどうかを確認する方法
- 12. glibcが使用されているかどうかを確認する方法
- 13. ファイル記述子を使用してファイルがまだ存在するかどうかを確認する方法
- 14. OAUTHを使用してYouTube認証が機能しているかどうかを確認する方法
- 15. FTPサーバ上のオブジェクトがPythonとftplibを使用しているファイルかディレクトリかを確認する
- 16. アプリケーションが実行中かどうかを確認する方法
- 17. powershellを使用してポートが使用されているかどうかを確認する方法
- 18. Windowsアプリケーション経由でリモートフォルダ上のファイルを確認する
- 19. PHPでプロファイラを使用してどのファイルがロードされているかを確認する方法
- 20. ファイルがasp.netで使用されているかどうかを確認する方法
- 21. 実行ファイルのパスを使用してWindowsサービスがインストールされているかどうかを確認するにはどうすればよいですか?
- 22. zipファイルが壊れているかどうかを確認するPythonスクリプト
- 23. どのアプリケーションでもカメラが開いているかどうかを確認する方法
- 24. .exeファイル(インストールされていない)がWindowsコマンドを使用して64ビットまたは32ビットであるかどうかを確認する方法
- 25. カウンターがセレンを使用して増加しているかどうかを確認する方法
- 26. Android:どのキーボードが使用されているかを確認する方法
- 27. サイトでフォーム認証が使用されているかどうかを確認する方法
- 28. Pythonを使用してリモートSSHサーバー上にファイルの存在を確認する
- 29. ユーザーがAndroidでタブレットまたは電話を使用しているかどうかを確認する方法
- 30. ファイルが空でないかどうかを確認する方法
ファイルがすでに削除共有なしで開いている場合(つまり、名前の変更がリンク解除のように動作する場合)、「rename」は失敗します。 Cランタイムは既定で読み取りと書き込みの共有を持つファイルを開くが、共有は削除しないので、コードは共通の既定の共有モードに基づいて開いているハンドルを検出します。プログラムが削除共有を使用してファイルを開くと、動作しません。ターゲットアプリはおそらく削除アクセスを共有していないだろうが、私はそれも排他的な書き込みアクセスを望んでいると思う。後者を確認するには、WinAPI ['CreateFile'](https://msdn.microsoft.com/en-us/library/aa363858)を書き込み共有なしで呼び出す必要があります。 – eryksun
'start'の'/B'オプションは、現在のプロセスがコンソールアプリケーションである場合にのみ重要なターゲットコンソールアプリケーション用の新しいコンソールの作成を防ぎます。また、プログラムがコンソールに同時にアクセスしようとすると混乱します。 '/ B'も新しいプロセスグループを作成しますが、cmdが直接' ShellExecuteEx'を使うのではなく 'CreateProcess'を呼び出すことができます。これはあなたのケースでは当てはまりません。ですから、私はあなたが 'start'なしで" file "を実行すべきだと思います。 'ShellExecuteEx'がDDEを使う間接的に' CreateProcess'を呼び出すと、cmdはプロセスハンドルを取得し、終了コードを待つことができます。 – eryksun
@eryksun、ターゲットアプリケーションはMS-Officeです。これにより、開いているファイルの名前を変更できなくなります。 GUIアプリケーションで使用される '' start/b file.xlsx "shell = True"のテクニックは、良い動作のために必要であることを経験が示しているからです。私はそれをさまざまな方法でテストしました。 – Ian