1
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

4 回答 4

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)
于 2013-06-27T23:38:06.747 回答
0

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

于 2013-06-28T00:05:14.620 回答
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需要一个列表。但问题是您将目录作为列表的一部分传递。该列表的格式如下:

[命令,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 连接在一起 -> command
'min' -> arg1
'edgelen' -> arg2]

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

于 2013-06-28T00:22:11.590 回答
0

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

于 2013-07-16T16:05:09.930 回答