49

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のコメント:ユースケースは明確ではありません。なぜサブプロセスを使用してPythonスクリプトを実行するのですか?スクリプトをインポートして必要な関数を呼び出すのを妨げるものはありますか?

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

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

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

また、何か問題が発生した場合に備えて、デバッグ用にstdoutとstderrをキャプチャしたいと思いました。

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

sys.executable基本的に、変数を見つけた後、スクリプトをプロセスとして実行する方がはるかに簡単でした。私はそれをシェルスクリプトとして書いたでしょうが、それはクロスプラットフォームではなかったでしょう。最終的なスクリプトはここにあります

4

8 に答える 8

70

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

import sys
import subprocess

theproc = subprocess.Popen([sys.executable, "myscript.py"])
theproc.communicate()
于 2009-05-26T21:26:10.983 に答える
25

これはどう:

import sys
import subprocess

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

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

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

于 2009-06-24T01:48:17.893 に答える
7

はいsubprocess.Popen(cmd, ..., shell=True)、魅力のように機能します。Windowsでは.pyファイル拡張子が認識されるため、Pythonが呼び出されて処理されます(* NIXでは通常のシバンのみ)。パス環境は、物事が表示されるかどうかを制御します。したがって、最初の引数Popenスクリプトの名前にすぎません。

subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True)
于 2011-06-13T10:15:57.697 に答える
5

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

python /the/script.py

試す、

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

編集:「python」はあなたの道にある必要があります。

于 2009-05-26T21:29:03.070 に答える
3

たとえば、コマンドプロンプトまたは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)
于 2014-07-15T07:40:06.250 に答える
2

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

于 2009-05-27T08:08:52.547 に答える
1

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

process = subprocess.Popen("python /the/script.py")
于 2009-05-26T21:26:41.250 に答える
0

補足情報shell=True:ドキュメントには、次のようなdosシェルコマンドを使用している場合に使用する必要があると記載されていることに注意してください。dir

それがなければ、あなたはこのようなものを手に入れます。

>>> import subprocess
>>> subprocess.run(['dir'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\foo\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 489, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Users\foo\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 854, in __ini
t__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\foo\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1307, in _exe
cute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified
>>> subprocess.run(['dir'], shell=True)
 Volume in drive J is garbage
 Volume Serial Number is 5EE7-B084

また、最近追加された引数にオブジェクトのようなパスを使用することもできます。

from pathlib import Path 
subprocess.run(Path('c:/proj/myfile.bat'))

また、並行操作で使用できるプロセスの生成方法を制御できるWindows固有のコントロールのセット全体があることにも注意してください。

したがって、Windowsでのサブプロセスの制御は、posixスタイルほど単純ではありません。

于 2021-11-19T09:23:04.080 に答える