Использование вызова подпроцесса Python для вызова скрипта Python

У меня есть сценарий 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 в той же папке, хотя. Я что-то здесь упускаю?

Ответы

Ответ 1

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

Помните, что способ работы Popen заключается в том, что первый аргумент - это программа, которую он выполняет, а остальные аргументы, передаваемые этой программе. В этом случае программа на самом деле 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)

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

Ответ 2

Windows? Unix?

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

#!/usr/bin/env python

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

chmod u+x script.py

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

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

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

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

Ответ 3

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

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)

Ответ 4

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

import os

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

os.waitpid(cpid, 0)

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

Ответ 5

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

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

Ответ 6

Что случилось с

import sys
from os.path import dirname, abspath

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

import somescript

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

import sys
from os.path import dirname, abspath

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

import somescript
somescript.baz()

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Пытаться

call ('python somescript.py')

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