Python调用子进程中模块内的函数

4
我可以帮您将以下内容翻译为中文:

我想要获取从主程序调用的模块函数的stdout、stderr和resultcode。我以为subprocess是关键,但我没有成功地将模块函数提交到subprocess。

我现在拥有的:

#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

发生了什么: 显然,subprocess模块对从my_module.run()返回的THAT进行了一些处理,导致了崩溃:
如果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 因此,subprocess显然希望将THAT作为包含文件路径的列表?

你的read_args()定义是什么?我正在尝试类似的东西,但无法使其工作。 - TobyTobyo
1个回答

3

您没有正确使用子进程:

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

顺便说一下,如果您没有使用 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格式了) 我不能直接启动运行函数吗? - user5134164
1
那我应该将我的argparser中的所有参数重新转换为字符串格式,然后使用转换后的参数运行主函数吗?难道没有一种简单地在sp.Popen()中调用函数的方法吗? - user5134164
忘记我之前说的关于另一种解决方案的话。我认为这是处理它的正确方式。也许其他人会提出另一种可能性,但目前我只看到这一种。 - FunkySayu
1
否则,你可以这样做:https://dev59.com/Z2Qn5IYBdhLWcg3wxZri - FunkySayu
1
完美!这个最后的选项完全符合我的需求!我还在想子进程从我的函数中期望什么返回... :/ 感谢您的帮助! - user5134164
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接