Python中的子进程库

2024-04-24 18:54:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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中有任何内容,则表示它无法检索任意特性,文件已损坏。在这里,我只在一个文件上运行它。但是,我一直收到一个错误。在

^{pr2}$

谁能帮我弄清楚为什么我会犯这个错误?我的数据目录和脚本目录都是有效的。另外,如果我遗漏了重要的东西,我很抱歉。首次发布。在


Tags: 文件sample目录脚本lenisdirscript
3条回答

在子流程.Popen()不会为您组合路径组件。从我看来,你只提供了一个目录。您需要将目标可执行文件的名称添加到指定给Popen的路径中。尝试以下操作:

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

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

问题在于:

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

注意这一部分:

^{pr2}$

现在,看,您已经知道subprocess需要一个列表。但问题是您将目录作为列表的一部分传递。列表的格式如下:

[命令,arg1,arg2…]

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

[SCRIPT_DIR->;命令
示例_file_目录->;arg1
“最小值”->;arg2
“埃德伦”->;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_目录连接在一起->;命令
“最小值”->;arg1
“埃德伦”->;arg2]

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

相关问题 更多 >