Python中的子处理库

时间:2013-06-27 23:00:36

标签: python subprocess

import subprocess

sample_file_directory = "..." # directory where file is
SCRIPT_DIR = "..." # directory where script is

p = subprocess.Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
min_side_len, err = p.communicate()
print len(err)

所以我有这个脚本分析.ply文件(3d文件格式)并给我关于该文件的数据。我试图在我的目录中找出哪些文件已损坏,哪些文件未损坏。所以我试图使用子进程库来运行脚本来查找.ply文件的任意特征(在这种情况下是最小边长)如果err中有任何内容,则意味着它无法检索任意特征和该文件已损坏。在这里,我只在一个文件上运行它。但是,我一直收到错误。

p = subprocess.Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

任何人都可以帮我弄明白我收到此错误的原因吗?我的数据目录和脚本目录都是有效的。另外,对不起,如果我遗漏任何重要的东西。第一次发帖。

4 个答案:

答案 0 :(得分:0)

subprocess.Popen()不会为您组合路径组件。从我看到的,你只提供一个目录。您需要将目标可执行文件的名称添加到给予Popen的路径中。请尝试以下方法:

p = subprocess.Popen([os.path.join(SCRIPT_DIR,SCRIPT_NAME),sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

答案 1 :(得分:0)

您的SCRIPT_DIR变量是您在运行脚本的位置有效的绝对路径还是相对路径?如果是后者,它可能不起作用,因为子进程可能在具有不同工作目录的不同环境中启动。

答案 2 :(得分:0)

问题在于:

p = subprocess.Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

请注意这一部分:

Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen']

现在,请注意,您已经知道subprocess会列出一个列表。但问题是您将目录作为列表的一部分传递。该列表的格式如下:

[command,arg1,arg2 ...]

现在,当您运行该命令时,您正在执行此操作:

[SCRIPT_DIR - >命令
sample_file_directory - > ARG1
'min' - > ARG2
'edgelen' - > ARG3]

看到问题?您将脚本的目录作为要运行的命令并将脚本的名称作为参数传递。导入os模块并执行以下操作:

p = subprocess.Popen([os.path.join(SCRIPT_DIR,sample_file_directory),'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

这样做:

[SCRIPT_DIR和sample_file_directory连在一起 - >命令
'min' - > ARG1
'edgelen' - > ARG2]

os.path.join会自动添加路径分隔符。

答案 3 :(得分:0)

“另一件事可能是你试图在没有安装32位库的情况下在64位系统上运行32位二进制文​​件。我今天早些时候遇到过这个问题。修复是记录在这里。我对你的系统一无所知,所以这可能是完全不相关的建议,但我认为提起它并不会有什么坏处。“丹艾伯特。他想出了解决方案的答案!非常感谢Dan!