Если вы хотите запустить сценарий с тем же исполняемым файлом Python, который используется для запуска текущего сценария, не используйте python
и полагайтесь на правильно заданный путь, просто используйте sys.executable
:
Строка, задающая абсолютный путь исполняемого двоичного файла для интерпретатора Python, в системах, где это имеет смысл.
Это работает, если вы выполнили сценарий сpython myscript.py
полагаясь на ПУТЬ активного виртуленва.Это также работает, если вы выполнили скрипт с /usr/local/bin/python3.6
, чтобы игнорировать PATH и протестировать ваш скрипт с определенным интерпретатором.Или, если вы выполнили сценарий с myscript.py
, полагаясь на строку shbang, созданную во время установки с помощью setuptools
.Или, если скрипт был запущен как CGI, в зависимости от конфигурации Apache.Или если вы sudo
d выполнили исполняемый файл или сделали что-то еще, что повредило вашу среду.Или почти все, что можно вообразить. 1
Как объяснено в ответ Чарльза Даффи , вам все равно нужно использовать список аргументов вместо строки (или использовать shell=True
, но вы редко хотите это сделать).Итак:
result = subprocess.run([sys.executable, 'other.py'], stdout=subprocess.PIPE)
1.Ну, не совсем ... Примеры того, как это не работает, включают пользовательские программы на C, которые включают интерпретатор CPython, некоторые среды для мини-Python для смартфонов, старый школьный Amiga Python, ... Наиболее вероятные, которые могут повлиять на вас- и это довольно большая протяженность - это то, что на некоторых * nix платформах, если вы пишете программу, которая exec
s Python, передавая несовместимые имена для процесса и arg0, sys.executable
может в итоге ошибиться.