1. ホーム
  2. python

[解決済み】「WindowsError: [エラー2]システムが指定されたファイルを見つけることができません」が解決されない

2022-02-11 09:40:07

質問

py2exeを使用して、いくつかのファイルを持つ私のPythonプロジェクトのexeファイルを作成しました。 このexeファイルを私のシステムで実行すると、正常に動作しますが、別のシステムで実行すると、ログインフォームが開き、その後、2番目のpythonファイルに書いた次のウィンドウに移動しません。

Traceback (most recent call last):
      File "login.py", line 246, in DataReader
      File "subprocess.pyo", line 711, in __init__
      File "subprocess.pyo", line 948, in _execute_child
    WindowsError: [Error 2] The system cannot find the file specified

重複した質問であることは承知していますが、stackoverflowの多くの解決策を試しましたが、この問題を解決することができませんでした。誰かがこの問題を解決するために私を助けてください。

そして、ログインに成功した後、このコードによってstart.pyファイルに移動しますが、移動せず、上記のエラーを出します。

    subprocess.call(["python", "./start.py"])

ありがとうございました。

どのように解決するのですか?

ここで、少なくとも2つの問題があります。


まず python を実行ファイルとして使用します。

あなたのシステム上では python の上に %PATH% であり、それは Pythonのバージョン、依存するモジュールなど、すべて。しかし、すべてのユーザーをそれに依存させることはできません。もしそれが可能なら、わざわざ py2exe を使うようになりました。

そして明らかに、あなたがテストしているもう一台のマシンには python の上に %PATH% で、WindowsError 2が発生します。

何はともあれ、このような場合に実行したいのは 同じ スクリプトが使っているPython


一方 start.py は、現在の作業ディレクトリにあるはずです。親スクリプトと同じディレクトリにあることが望ましいのですが、それは作業ディレクトリではありません。通常、Windowsのプログラムは、C: \とか、WINNTディレクトリとか、ユーザーのホームディレクトリとかで起動しますし、バージョンによっても違います。

もちろん、開発中は、スクリプトを実行するたびに、スクリプトのディレクトリを作業ディレクトリとして、コマンドプロンプトを使用しているか、事実上同等のことを行うIDEを使用しているはずです。だから、たまたまうまくいくのです。しかし、.exeから実行する場合は、それをあてにすることはできません。

(こちらはデバッグがさらに楽しくなりそうです。サブプロセスは正常に開始され、何も目に見えることをせずにすぐに終了します。終了コードや標準エラーメッセージをチェックしないので、親スクリプトは何か問題があったことを知ることができませんが、これはデバッグを楽しくしてくれます。デバッグが楽しくなります。 check_call ではなく call .)

とにかく、自分のスクリプトと同じディレクトリにある別のスクリプトを探させたい場合は、そう明示する必要があるのです。


そこで、この2つの問題を解決するために

import os
import sys
mypath = os.path.abspath(__file__)
mydir = os.path.dirname(mypath)
start = os.path.join(mydir, "start.py")
subprocess.call([sys.executable, start])


最後にもうひとつ、あなたのコメントから、あなたが実際にバンドルしているのかどうかさえわかりません。 start.py を配布可能なパッケージの中に全く入れていません。あなたのマシンで動作している場合、それは明らかに C:\Python27\start.py . しかし、あなたがテストしているマシンでは...それはどこにも存在しないのでしょうか?もしなければ、明らかに実行できないでしょう。

のようなツール py2exe は自動的に import を経由して別のインタプリタインスタンスでスクリプトを実行する場合は、このようなことはありません。 subprocess ということを伝える必要があります。 setup.py を含むようにします。