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. python PDFファイルが開いているかどうかを確認する方法
- 4. WindowsデスクトップアプリケーションがWindowsハンドヘルドデバイスで使用されているかどうかをプログラムで確認する方法
- 5. ネットワークアダプタがWindows上でリムーバブルかどうかを確認する方法
- 6. VSプロジェクトがWEBアプリケーションまたはWindowsアプリケーションに属しているかどうかを確認する方法
- 7. JavaScriptを使用してマウスが上下に動いているかどうかを確認する方法は?
- 8. Windowsでバッチファイルを使用してポート80を使用できるかどうかを確認する方法xp
- 9. DLLが別のアプリケーションで使用されているかどうかを確認してください
- 10. インテントフィルタがアプリケーションで使用されているかどうかを確認する
- 11. ファイルがWindowsネットワーク共有にあるかどうかを確認する方法?
- 12. jQueryが特定のWebアプリケーションで使用されているかどうかを確認する方法は?
- 13. 別のプログラムが開いているファイルがあるかどうかを確認
- 14. ファイルがクリップのあるディレクトリ内の別のファイルと等しいかどうかを確認する方法
- 15. javascriptを使用して値が別の値より大きいかどうかを確認する方法
- 16. デバイス上にアプリケーションがあるかどうかを確認する
- 17. localhostを使用してファイルがphpに存在するかどうかを確認する正しい方法
- 18. アプリケーションがiCloudスキーマ開発またはプロダクションを使用しているかどうかを確認する方法
- 19. マイクロフォーマットを使用しているかどうかを確認する方法
- 20. glibcが使用されているかどうかを確認する方法
- 21. Python gtk:コンボボックスが開いているかどうかを確認する方法?
- 22. プロセスがWindowsでPython 2.2を使用して実行されているかどうかを確認するには?私は確認する必要がある
- 23. ファイル記述子を使用してファイルがまだ存在するかどうかを確認する方法
- 24. TI J6:アプリケーションでGPUを使用しているかどうかを確認する方法
- 25. アプリケーションが実行中かどうかを確認する方法
- 26. OAUTHを使用してYouTube認証が機能しているかどうかを確認する方法
- 27. FirebaseユーザーがFacebook認証を使用してサインインしているかどうかを確認する方法
- 28. ライブラリがiOSアプリケーションで使用されているかどうかを確認する方法
- 29. Windowsアプリケーション経由でリモートフォルダ上のファイルを確認する
- 30. ファイルが存在するかどうかを確認し、Windowsのコマンドラインを使用して名前を変更
ファイルがすでに削除共有なしで開いている場合(つまり、名前の変更がリンク解除のように動作する場合)、「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