passthru() + 子进程中的管道 = Traceback(最近一次调用最后一次):(…)在 stdout=subprocess.PIPE)

Posted

技术标签:

【中文标题】passthru() + 子进程中的管道 = Traceback(最近一次调用最后一次):(…)在 stdout=subprocess.PIPE)【英文标题】:passthru() + Pipe in subprocess = Traceback (most recent call last): (…) in stdout=subprocess.PIPE) 【发布时间】:2012-03-31 05:46:00 【问题描述】:

当我使用 passthru() 通过 php 调用 python 脚本(使用子进程和管道)时出现错误。

这是错误:

Traceback(最近一次调用最后一次):文件“…/Desktop/h.py”,第 11 行,在 stdout=subprocess.PIPE)#设置转换命令并将输出定向到管道文件“/System/ Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/subprocess.py”,第 593 行,在 init errread, errwrite) 文件“/System/Library/Frameworks/Python. framework/Versions/2.5/lib/python2.5/subprocess.py", line 1079, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory

PHP 通路:

<?php
passthru("/usr/bin/python2.5 /Users/Nagar/Desktop/h.py $argument1 $argument2 1 2>&1");
?>

导致错误的我的 Python 行:

p1 = subprocess.Popen(['convert', fileIn, 'pnm:-'], stdout=subprocess.PIPE) #set up the convert command and direct the output to a pipe

如何在子流程中正确使用stdout=subprocess.PIPE?

期待您的回答。

【问题讨论】:

【参考方案1】:

因为需要通过shell执行,所以需要设置shell参数为True:

p1 = subprocess.Popen(['convert', fileIn, 'pnm:-'], stdout=subprocess.PIPE, shell=True)convert command and direct the output to a pipe

【讨论】:

【参考方案2】:

您的 PATH 似乎没有包含“转换”命令的目录。尝试替换:

p1 = subprocess.Popen(['convert', fileIn, 'pnm:-'], stdout=subprocess.PIPE)

与:

p1 = subprocess.Popen(['/full/path/to/convert', fileIn, 'pnm:-'], stdout=subprocess.PIPE)

其中“/full/path/to/convert”可能类似于“/usr/bin/convert”。

【讨论】:

以上是关于passthru() + 子进程中的管道 = Traceback(最近一次调用最后一次):(…)在 stdout=subprocess.PIPE)的主要内容,如果未能解决你的问题,请参考以下文章

管道被 Perl 中的子进程阻塞

Perl:关闭信号处理程序中的子进程管道挂起?

Python 子进程中的 ffmpeg - 无法为“管道:”找到合适的输出格式

C Linux 编程 - 管道使子进程退出

如何在Linux上的c中的父进程和子进程之间进行乒乓球

Java多进程管道通信