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