【发布时间】:2021-01-27 08:44:40
【问题描述】:
这里有subrpocess问题的初学者:
当我用更少的数据运行两个脚本时,下面的行工作正常,大约需要 10-20 分钟,但是如果要处理更大的数据,一旦两个脚本都完成,子进程就不会返回任何内容(假设在一小时内)。
另外:通常在数据较少的情况下,它的行为也会异常,即不返回 status_code/通过。然后我必须再次运行 sn-p 并且它可以工作。任何可靠的推理都会有很大帮助!
status_code = subprocess.run(f"python3 scriptA.py {param_1} & python3 scriptB.py {param_2}",
shell=True).returncode
if status_code == 0:
print("subprocess ended ..") # the control does not come here incase of huge files
some_other_file.main(some_param1, some_param2)
我不明白为什么会发生这种情况(或者我应该使用不同的方法吗?),非常感谢任何帮助。谢谢!
脚本示例(scriptA 和 scriptB):
def main(param_2):
some_func_with_csv_operations() # not returning anything
more_funcs()
if __name__ == "__main__":
param_2 = sys.argv[1]
main(param_2)
另外,没有任何 scriptA 或 scriptB sys.exit()
编辑:
截图:
尝试在if 条件之前打印status_code,没有打印任何内容,在终端中,我看到一个光标在闪烁。
另外(寻找任何 python 进程):
使用ps -ax | grep python显示没有相关信息(附图)
【问题讨论】:
-
这意味着返回的状态码不是 0。这意味着通过 subprocess.run() 调用的脚本之一遇到了错误。这意味着您应该首先检查这些脚本,它们为什么会出错。
-
@pepoluan 不,脚本很好。当脚本使用较少的数据运行时,通常会发生这种情况。有时它会通过,有时它不会返回 status_code。当两个脚本都完成时。我使用
ps -ax | grep python进行检查,发现没有运行 python 脚本。 -
您有什么理由在一个子进程中运行两个脚本吗?将两个脚本分成两个子进程将帮助您了解故障发生在哪里
-
你可以在python中并行运行两个子进程。使用
Popen构造函数而不是run函数,然后在收集返回码之前在每个进程上调用wait。如果你这样做,你也不需要shell=True。 -
@Shannon 可以将其作为答案发布吗?也许与 Popen 相当的一些细节(做我在 subprocess.run 中的工作)会有所帮助
标签: python python-3.x multithreading shell subprocess