Получить вывод python script из python script
printbob.py:
import sys
for arg in sys.argv:
print arg
getbob.py
import subprocess
#printbob.py will always be in root of getbob.py
#a sample of sending commands to printbob.py is:
#printboby.py arg1 arg2 arg3 (commands are seperated by spaces)
print subprocess.Popen(['printbob.py', 'arg1 arg2 arg3 arg4']).wait()
x = raw_input('done')
Я получаю:
File "C:\Python27\lib\subprocess.py", line 672, in __init__
errread, errwrite)
File "C:\Python27\lib\subprocess.py", line 882, in _execute_child
startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application
Что я здесь делаю неправильно?
Я просто хочу получить вывод другого python script внутри другого python script.
Мне нужно вызвать cmd.exe или я могу просто запустить printbob.py и отправить ему команды?
Ответы
Ответ 1
proc = subprocess.Popen(['python', 'printbob.py', 'arg1 arg2 arg3 arg4'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print proc.communicate()[0]
Должен быть лучший способ сделать это, поскольку script также находится в Python. Лучше найти способ использовать это, чем то, что вы делаете.
Ответ 2
Это неправильный подход.
Вам следует реорганизовать printbob.py
, чтобы он мог быть импортирован другими модулями python. Эта версия может быть импортирована и вызвана из командной строки:
#!/usr/bin/env python
import sys
def main(args):
for arg in args:
print(arg)
if __name__ == '__main__':
main(sys.argv)
Здесь он вызывается из командной строки:
python printbob.py one two three four five
printbob.py
one
two
three
four
five
Теперь мы можем импортировать его в getbob.py
:
#!/usr/bin/env python
import printbob
printbob.main('arg1 arg2 arg3 arg4'.split(' '))
Здесь он работает:
python getbob.py
arg1
arg2
arg3
arg4
Ответ 3
Аргумент оболочки (по умолчанию False) указывает, следует ли использовать оболочку как программу для выполнения. Если shell True, это рекомендуется передавать args как строку, а не как последовательность
Просто оберните все аргументы в строку и дайте shell=True
proc = subprocess.Popen("python myScript.py --alpha=arg1 -b arg2 arg3" ,stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
print proc.communicate()[0]
Ответ 4
Функция subprocess.run()
была добавлена в Python 3.5.
import subprocess
cmd = subprocess.run(["ls", "-ashl"], capture_output=True)
stdout = cmd.stdout.decode() # bytes => str
см. PEP 324 - PEP предлагает модуль подпроцесса