2015-07-20 2 views
2

Я хотел бы получить stdout, stderr и resultcode функции модуля, вызванной из основной программы. Я думал, что подпроцесс был ключом, но мне не удается передать функцию модуля подпроцессу.Функция вызова Python из модуля в подпроцессе

Что у меня есть:

#my_module.py 
def run(args): 
    do stuff 
    print this 
    return THAT 
if name == "__main__": 
    args = read_args() 
    run(args) 

.

#my_main_script.py 
import subprocess as sp 
import my_module 
p = sp.Popen(my_module.run(args), stdout=sp.PIPE, stderr=sp.PIPE) 
out, err = p.communicate() 
result = p.resultcode 

Что происходит: Видимо модуль подпроцесс делает что-то с тем, что вернулся из my_module.run() провоцируя аварии:

если THAT = list_of_lists ошибка: AttributeError: "sublist" object has no attribute rfind

THAT = ["a","b",0] если ошибка: TypeError: execv() arg 2 must contain only strings
если THAT = ["a","b"] ошибка: OSError: [Errno 2] No such file or directory

So subprocess, по-видимому, хочет, чтобы THAT был списком, содержащим путь к файлам ???

+0

Что ваши read_args() определение? Я пытаюсь что-то подобное, но не могу заставить его работать. – TobyTobyo

ответ

2

Вы не используете подпроцесс в правильном направлении:

sp.Popen(["./my_module.py", "arg1", "arg2"], stdout=sp.PIPE, stderr=sp.PIPE) 

Кстати, вы не получите никакого ResultCode, если вы не выйти должным образом свою программу с функцией sys.exit(retcode).

Окончательные сценарии будет выглядеть следующим образом:

#my_module.py 
def run(args): 
    do stuff 
    print this 
    return THAT 

if name == "__main__": 
    import sys 
    args = read_args() 
    sys.exit(run(args)) 

#my_main_script.py 
import subprocess as sp 

p = sp.Popen(["./my_module.py", "arg1", "arg2"], stdout=sp.PIPE, stderr=sp.PIPE) 
out, err = p.communicate() 
result = p.returncode 
+1

как модуль получит аргументы? (они уже находятся в формате argparse) Могу ли я просто запустить функцию запуска? – Trolldejo

+0

Отредактировано. Извините, я забыл эту часть. – FunkySayu

+1

Итак, я должен переконвертировать все аргументы из моего argparser в строковый формат, а затем запустить main с преобразованными аргументами? Нельзя вообще просто вызвать функцию в sp.Popen()? – Trolldejo

Смежные вопросы