【问题标题】:Subprocess Python Error子进程 Python 错误
【发布时间】:2016-06-17 03:31:54
【问题描述】:

当我从 python 运行这个子进程命令时,似乎 python 停止并且从不输出任何东西:

msg = subprocess.call(['/Users/admirmonteiro/bin/Praat', '/Users/admirmonteiro/tmp/tmp.praat'])

但是当我从终端运行命令本身时,它会按应有的方式运行和关闭:

Praat /tmp/tmp.praat 

有人能告诉我为什么 python 没有完成代码并且停止并且没有输出任何东西吗?

谢谢!

【问题讨论】:

  • 你需要对子进程的stdin stdout和stderr做点什么吗?子流程会产生大量输出,还是期望输入?也许通过从父进程继承,它们导致子进程认为有数据要读取,因此它正在等待能够读取标准输入?
  • 不,我不相信(Praat 的输入是 tmp.praat),根本没有输出,它实际上打开了 praat 工具本身并希望我运行该文件,当我运行时subprocess 命令有一个输出。我不想要这个过程。我希望它就像我从终端运行它一样,当我调用它时,它运行 Praat /tmp/tmp.praat 并自行关闭。
  • 如果您运行“cat /dev/null | Praat /tmp/tmp.praat | cat”之类的命令,它是否可以在命令行上工作?想知道 Praat 进程是否正在检测 tty 标准输入/标准输出并因此而表现不同。
  • 嗨,汤姆,是的,它没有错误。
  • 在终端输入type Praat会看到什么?如果您传递相同的文件 /tmp/tmp.praat 而不是 /User.../tmp.praat,会发生什么?

标签: python terminal subprocess


【解决方案1】:

您可以尝试确保标准输入和标准输出(或其他文件描述符)没有导致问题:

p = subprocess.POpen(
    ['/Users/admirmonteiro/bin/Praat', '/Users/admirmonteiro/tmp/tmp.praat'],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
    close_fds=True,
)
print p.communicate()
print p.wait()

【讨论】:

  • 我试过了,但它再次打开了 Praat,并希望我按下运行按钮,然后在 python 返回之前退出它。
【解决方案2】:

看来你们已经交换了论点。

msg = subprocess.call(['/Users/admirmonteiro/bin/Praat', '/Users/admirmonteiro/tmp/tmp.praat'])

应该是

msg = subprocess.call([ '/Users/admirmonteiro/tmp/tmp.praat','/Users/admirmonteiro/bin/Praat'])

【讨论】:

  • 好的,很奇怪,但是当我运行这个时: msg = subprocess.call([ '/Users/admirmonteiro/tmp/tmp.praat','/Users/admirmonteiro/bin/Praat'],shell =True)我收到此错误:/Users/admirmonteiro/bin/Praat: /Users/admirmonteiro/tmp/tmp.praat: Permission denied。
  • 完美。现在将 '/Users/admirmonteiro/tmp/tmp.praat 的权限更改为可执行 chmod +x '/Users/admirmonteiro/tmp/tmp.praat 如果您在 *nix 平台上
  • 有一个新错误:Traceback(最近一次调用最后一次):文件“”,第 1 行,在 文件“/Users/admirmonteiro/anaconda/lib/python2.7/ subprocess.py”,第 522 行,调用 return Popen(*popenargs, **kwargs).wait() 文件“/Users/admirmonteiro/anaconda/lib/python2.7/subprocess.py”,第 710 行,在 init errread, errwrite) 文件“/Users/admirmonteiro/anaconda/lib/python2.7/subprocess.py”,第 1335 行,_execute_child raise child_exception OSError: [Errno 8] Exec format error
  • 这个答案看起来是错误的——调用的第一个参数是要执行的进程的 arg 列表,其中第一个元素是可执行文件(sys.argv[0 ])。按照原帖的顺序应该是["runnable_thing.py", "arg1", "arg2"]
猜你喜欢
  • 2010-10-26
  • 2015-07-13
  • 2014-03-30
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多