web-dev-qa-db-ja.com

サブプロセスを使用して、WindowsでPythonスクリプトを実行

Windows/Linux/OS XでPythonスクリプトを実行する簡単な方法はありますか?

後者の2つではsubprocess.Popen("/the/script.py")は機能しますが、Windowsでは次のエラーが表示されます。

_Traceback (most recent call last):
  File "test_functional.py", line 91, in test_functional
    log = tvnamerifiy(tmp)
  File "test_functional.py", line 49, in tvnamerifiy
    stdout = PIPE
  File "C:\Python26\lib\subprocess.py", line 595, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
    startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application
_

monkut's comment:ユースケースは明確ではありません。サブプロセスを使用してpythonスクリプトを実行するのはなぜですか?スクリプトのインポートと必要な関数の呼び出しを妨げる何かがありますか?

Pythonコマンドラインツールの全体的な機能をテストする(さまざまなプラットフォームでテストする)ための簡単なスクリプトを書いていました。基本的には、tempフォルダーに多数のファイルを作成し、このスクリプトを実行して、ファイルの名前が正しく変更されたことを確認する必要がありました。

スクリプトをインポートして関数を呼び出すこともできますが、_sys.argv_に依存し、sys.exit()を使用するため、次のようなことをする必要があります。

_import sys
import tvnamer
sys.argv.append("-b", "/the/folder")
try:
    tvnamer.main()
except BaseException, errormsg:
    print type(errormsg)
_

また、何かがおかしくなった場合に備えて、デバッグのために標準出力と標準エラー出力をキャプチャしたかったのです。

もちろん、より良い方法は、よりユニットテスト可能な方法でスクリプトを記述することですが、スクリプトは基本的に「完了」しており、「1.0」リリースを行う前にテストの最終バッチを実行しています(その後、書き直し/再構築を行います。これははるかにきれいでテストしやすくなります)

基本的に、_sys.executable_変数を見つけた後、スクリプトをプロセスとして単純に実行する方がはるかに簡単でした。シェルスクリプトとして記述していましたが、それはクロスプラットフォームではありませんでした。最終的なスクリプトを見つけることができます here

38
dbr

見つかった sys.executable -現在のPython実行可能ファイルへのフルパス。スクリプトを実行するために使用できます(shbangに依存する代わりに、明らかにWindowsでは機能しません)

import sys
import subprocess

theproc = subprocess.Popen([sys.executable, "myscript.py"])
theproc.communicate()
60
dbr

これはどう:

import sys
import subprocess

theproc = subprocess.Popen("myscript.py", Shell = True)
theproc.communicate()                   # ^^^^^^^^^^^^

これは、subprocessにOSシェルを使用してスクリプトを開くように指示し、cmd.exeで実行できるものなら何でも動作します。

さらに、これは「myscript.py」のPATHを検索します-これは望ましい場合があります。

21
Roman Starkov

はいsubprocess.Popen(cmd, ..., Shell=True)はチャームのように機能します。 Windowsでは、.pyファイル拡張子が認識されるので、Pythonがそれを処理するために呼び出されます(* NIXでは通常のShebangのみ)。パス環境は、物事を見るかどうかを制御します。したがって、Popenの最初の引数は- スクリプトの名前のみ

subprocess.Popen(['myscript.py', 'arg1', ...], ..., Shell=True)
6
hmc

Windowsは次のように呼び出すのではなく、独自のEXEフレームワークを使用してスクリプトを実行しようとするようです

python /the/script.py

試して、

subprocess.Popen(["python", "/the/script.py"])

編集:「python」がパス上にある必要があります。

4
viksit

プラットフォームに依存するパス名セパレータを使用しています。 Windowsは「\」を使用し、Unixは「/」を使用します。

2
user59634

たとえば、コマンドプロンプトまたはBATCHファイルで次を実行するには、これを使用できます。

C:\Python27\python.exe "C:\Program files(x86)\dev_appserver.py" --Host 0.0.0.0 --post 8080 "C:\blabla\"

Pythonでも同じことができます。これを行うことができます。

subprocess.Popen(['C:/Python27/python.exe', 'C:\\Program files(x86)\\dev_appserver.py', '--Host', '0.0.0.0', '--port', '8080', 'C:\\blabla'], Shell=True)

または

subprocess.Popen(['C:/Python27/python.exe', 'C:/Program files(x86)/dev_appserver.py', '--Host', '0.0.0.0', '--port', '8080', 'C:/blabla'], Shell=True)
2
YumYumYum

サブプロセスのウィンドウでpythonスクリプトを実行している場合、スクリプト名の前にpythonを使用する必要があります。試してみてください。

process = subprocess.Popen("python /the/script.py")
1
Robbie