【问题标题】:Python3.5 subprocess errorPython3.5子进程报错
【发布时间】:2018-06-06 20:01:29
【问题描述】:

我正在使用以下函数逐行读取我的 python 脚本输出并并行保存。但最终得到 Traceback 错误。

代码:

def myrun(cmd):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    stdout = []
    while True:
        line = p.stdout.readline()
        stdout.append(line)
        print (line),
        if line == '' and p.poll() != None:
            break
    return ''.join(stdout)

当调用函数为:

myrun(os.system("./tests_run.py"))

我得到以下错误:

错误:

Traceback (most recent call last):
  File "./Portability_Tests.py", line 38, in <module>
    myrun(os.system("./tests_run.py"))
  File "./Tests.py", line 11, in myrun
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  File "/usr/local/lib/python3.5/subprocess.py", line 676, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.5/subprocess.py", line 1171, in _execute_child
    args = list(args)
TypeError: 'int' object is not iterable

有人知道我该如何解决这个错误吗?

【问题讨论】:

  • 您不需要用os.system 包装命令(顺便说一句,这是不安全的);试试myrun("./tests_run.py")(假设命令正确)。
  • 我也尝试过,但没有帮助并抛出语法错误。

标签: python logging subprocess python-3.5


【解决方案1】:

subprocess.Popen 函数接收“程序参数序列或单个字符串”作为其args 参数。

您在args 参数中传递的是os.system() 调用的输出,根据documentation 是“进程的退出状态”,因此是int 数字。相反,在cmd 变量中,您应该直接传递文件/tests_run.py 的字符串(或其他迭代器)。如果您希望此路径与您当前的项目相关,您可以使用 os.path 模块。

【讨论】:

  • 我确实尝试过直接调用“./tests_run.py”但是thtows语法错误。
  • 能否请您发布回溯?
  • 没有回溯它一直打印 b'' 直到我手动执行键盘中断 b'' b'' b'' b'' b'' b'' b'' ^CTraceback (最近一次调用最后):文件“./tests_run.py”,第 52 行,在 myrun("./Tests.py") 文件“./tests_run.py”,第 16 行,在 myrun 打印(行),KeyboardInterrupt
  • 该错误与问题的原始错误无关。你一直看到这个 b" 因为你的代码中有 while True 语句。你需要修改它以便脚本可以在某个时候停止。但是就这个线程而言,因为你设法访问了 ./tests .py 文件,您可以接受答案并关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2014-03-31
  • 2017-04-07
  • 1970-01-01
  • 2022-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多