Использование вызова подпроцесса Python для вызова скрипта Python - PullRequest
28 голосов
/ 22 августа 2011

У меня есть скрипт Python, который должен вызвать другой скрипт Python в том же каталоге. Я сделал это:

from subprocess import call
call('somescript.py')

Я получаю следующую ошибку:

call('somescript.py')
File "/usr/lib/python2.6/subprocess.py", line 480, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child

raise child_exception
OSError: [Errno 2] No such file or directory

У меня есть скрипт somescript.py в той же папке. Я что-то здесь упускаю?

Ответы [ 9 ]

35 голосов
/ 07 марта 2014

Если 'somescript.py' не является чем-то, что вы обычно можете выполнить непосредственно из командной строки (т. Е. $: somescript.py работает), то вы не можете вызвать его напрямую с помощью call.

Помните, чтоПопен работает так, что первый аргумент - это программа, которую он выполняет, а остальные аргументы, передаваемые этой программе.В этом случае программа на самом деле python , а не ваш скрипт.Таким образом, следующее будет работать так, как вы ожидаете:

subprocess.call(['python', 'somescript.py', somescript_arg1, somescript_val1,...]).

Это правильно вызывает интерпретатор Python и говорит ему выполнить ваш скрипт с заданными аргументами.

Обратите внимание, что это отличается от приведенного вышепредложение:

subprocess.call(['python somescript.py'])

Это попытается выполнить программу с именем python somscript.py , которая явно не существует.

call('python somescript.py', shell=True)

Также будет работать,но использование строк в качестве входных данных для вызова не является кроссплатформенным, опасно, если вы не тот, кто строит строку, и обычно его следует избегать, если это вообще возможно.

5 голосов
/ 22 августа 2011

Windows? Unix?

Для работы Unix потребуется атрибут shebang и exec:

#!/usr/bin/env python

в качестве первой строки скрипта и:

chmod u+x script.py

в командной строке или

call('python script.py'.split())

как упоминалось ранее.

Windows должна работать, если вы добавите параметр shell = True к вызову "call".

3 голосов
/ 18 марта 2015

Проверьте это.

from subprocess import call 
with open('directory_of_logfile/logfile.txt', 'w') as f:
   call(['python', 'directory_of_called_python_file/called_python_file.py'], stdout=f)
2 голосов
/ 23 августа 2011

Если вы работаете в Linux / Unix, вы можете вообще избежать call () и не запускать совершенно новый экземпляр исполняемого файла Python и его окружение.

import os

cpid = os.fork()
if not cpid:
    import somescript
    os._exit(0)

os.waitpid(cpid, 0)

Для чего это стоит.

2 голосов
/ 22 августа 2011

subprocess.call ожидает те же аргументы, что и subprocess.Popen - это список строк (argv в C), а не одна строка.

Вполне возможно, что ваш дочерний процесс попытался запустить "s" с параметрами "o", "m", "e", ...

1 голос
/ 04 июля 2017

Что не так с

import sys
from os.path import dirname, abspath

local_dir = abspath(dirname(__file__))
sys.path.append(local_dir)

import somescript

или, что еще лучше, оберните функциональность в функцию, например, Баз, тогда сделай это.

import sys
from os.path import dirname, abspath

local_dir = abspath(dirname(__file__))
sys.path.append(local_dir)

import somescript
somescript.baz()

Кажется, что есть много скриптов, запускающих процессы Python или разветвление, это требование?

0 голосов
/ 02 апреля 2014
def main(argv):
    host = argv[0]
    type = argv[1]
    val = argv[2]

    ping = subprocess.Popen(['python ftp.py %s %s %s'%(host,type,val)],stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell=True)
    out = ping.communicate()[0]
    output = str(out)
    print output
0 голосов
/ 22 августа 2011

Сначала проверьте, является ли somescript.py исполняемым и начинается с чего-то вроде #!/usr/bin/python. Если это сделано, то вы можете использовать subprocess.call('./somescript.py').

Или, как указывает другой ответ, вы можете сделать subprocess.call(['python', 'somescript.py']).

0 голосов
/ 22 августа 2011

Вызов подпроцесса является очень буквальным системным вызовом. его можно использовать для любого общего процесса ... поэтому он не знает, что делать со скриптом Python автоматически.

Попробуйте

call ('python somescript.py')

Если это не сработает, возможно, вы захотите попробовать абсолютный путь и / или проверить разрешения для вашего скрипта Python ... типичные забавные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...