Использование подпроцесса для запуска скрипта Python в Windows - PullRequest
38 голосов
/ 27 мая 2009

Есть ли простой способ запустить скрипт Python в Windows / Linux / OS X?

На последних двух 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. Я написал бы это как shell-скрипт, но он не был бы кроссплатформенным. Окончательный сценарий можно найти здесь

Ответы [ 7 ]

60 голосов
/ 27 мая 2009

Только что найдено sys.executable - полный путь к текущему исполняемому файлу Python, который можно использовать для запуска сценария (вместо использования shbang, который, очевидно, не работает в Windows)

import sys
import subprocess

theproc = subprocess.Popen([sys.executable, "myscript.py"])
theproc.communicate()
21 голосов
/ 24 июня 2009

Как насчет этого:

import sys
import subprocess

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

Это говорит subprocess использовать оболочку ОС для открытия вашего скрипта и работает на всем, что вы можете просто запустить в cmd.exe.

Кроме того, при поиске в PATH будет найден «myscript.py», что может быть желательным.

6 голосов
/ 13 июня 2011

Да subprocess.Popen(cmd, ..., shell=True) работает как шарм. В Windows распознается расширение файла .py, поэтому для его обработки вызывается Python (в * NIX просто обычный шебанг). Путь окружения контролирует, видят ли вещи. Таким образом, первый аргумент Popen это просто имя скрипта .

subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True)
4 голосов
/ 27 мая 2009

Похоже, что Windows пытается запустить скрипт, используя собственную среду EXE, а не вызывать его как

python /the/script.py

Попробуйте,

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

Редактировать: "питон" должен быть на вашем пути.

2 голосов
/ 15 июля 2014

Например, чтобы выполнить следующее с командной строкой или файлом 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 голосов
/ 27 мая 2009

Вы используете разделитель пути, который зависит от платформы. Windows использует "\", а Unix использует "/".

1 голос
/ 27 мая 2009

Когда вы запускаете скрипт Python в Windows в подпроцессе, вы должны использовать Python перед именем скрипта. Попробуйте:

process = subprocess.Popen("python /the/script.py")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...