web-dev-qa-db-ja.com

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

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

私はそれが重複した質問であることを知っていますが、私はスタックオーバーフローの多くの解決策を試しましたが、私はこの問題を解決しませんでした。誰かがこの問題を解決するために私を助けてくれます。

そして、正常にログインした後、このコードでstart.pyファイルに移動しますが、それは実行されず、上記のエラーが発生します。

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

前もって感謝します

6
Ashish Jain

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


まず、実行可能ファイルとしてpythonだけを使用することはできません。

あなたのシステムでは、%PATH%pythonがあり、それはright Pythonバージョンで、すべてのモジュールがありますに依存するなど。ただし、すべてのユーザーがこれに依存することはできません。可能であれば、そもそもpy2exeを気にする必要はありません。

そして明らかに、テストしている他のマシンでは、%PATH%pythonという名前の名前がまったくないため、WindowsError2が発生します。

とにかく、スクリプトが使用している同じ Python)で実行する必要があります。


一方、start.pyが現在の作業ディレクトリにあると期待する理由はありません。それは(うまくいけば)親スクリプトと同じディレクトリにありますが、おそらくそれは作業ディレクトリではありません。通常、Windowsプログラムは、C:\、WINNTディレクトリ、またはユーザーのホームディレクトリなどで起動し、バージョンごとに異なります。

もちろん、開発中は、通常、コマンドPromptを使用し、スクリプトを実行するときは常にスクリプトのディレクトリを作業ディレクトリとして使用するか、IDE)を使用して効果的に同等の処理を行います。したがって、たまたま機能しますが、.exeから実行する場合は、それを当てにすることはできません。

(これはデバッグがさらに楽しくなります。サブプロセスは正常に開始され、何も表示されずにすぐに終了します。終了コードまたはstderrをチェックしていないため、親スクリプトは何かがうまくいかなかったことを認識しません。これにより、デバッグが非常に楽しくなります。実際には、callではなくcheck_callを使用する必要があります。)

とにかく、スクリプトがそれ自体と同じディレクトリにある別のスクリプトを見つけたい場合は、明示的に言う必要があります。


したがって、これらの問題の両方を修正するには、次のようにします。

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

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

py2exeのようなツールは、importの依存関係を自動的に見つけることができますが、subprocessを介して別のインタープリターインスタンスでスクリプトを実行している場合は、次のように指示する必要があります。 (setup.pyに)そのスクリプトを含めます。

4
abarnert