gpt4 book ai didi

python - 在子进程中,某些命令有效,但 Mac 终端中的其他命令无效

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:25 25 4
gpt4 key购买 nike

我正在尝试创建一个在 Mac 终端上运行 perl 脚本的 python 脚本。流行的 3D 打印机切片引擎 Slic3r 具有使用命令行用法的能力,它是用 Perl 编写的。我想写一个 python 脚本来自动化一些过程,这是我最了解的语言。如果我直接在终端中输入我想使用的命令,它会正常工作,但是,如果我尝试使用 python 的 subprocess,它对某些命令有效,但对其他命令无效。

例如,如果我使用我的脚本使用 docs 中列出的语法获取 Slic3r 版本, 它工作正常。这个脚本有效:

import os
import subprocess

os.system("cd Slic3r")

perl = "perl"
perl_script = "/Users/path/to/Slic3r/slic3r.pl"
params = "--version"

pl_script = subprocess.Popen([perl, perl_script, params], stdout=sys.stdout)
pl_script.communicate()

print 'done'

返回:

1.3.0-dev
done

如果我使用诸如 --info 之类的命令(有关更多信息,请参阅修复模型下的 Slic3r 文档)使用相同的脚本,我会得到:

在:

import os
import subprocess

os.system("cd Slic3r")

perl = "perl"
perl_script = "/Users/path/to/Slic3r/slic3r.pl"
params = "--info /Users/path/to/Desktop/STL_Files/GEAR.stl"

pl_script = subprocess.Popen([perl, perl_script, params], stdout=sys.stdout)
pl_script.communicate()

print 'done'

输出:

Unknown option: info /Users/path/to/Desktop/STL_Files/GEAR.stl
Slic3r 1.3.0-dev is a STL-to-GCODE translator for RepRap 3D printers
written by Alessandro Ranellucci <aar@cpan.org> - http://slic3r.org/

Usage: slic3r.pl [ OPTIONS ] [ file.stl ] [ file2.stl ] ...

根据我的研究,我怀疑将字符串的空格用作参数存在一些问题。在尝试这个项目之前,我从未使用过 subprocess,因此可能会出现简单的语法错误。

我知道 Slic3r 语法是正确的,因为如果我直接在终端中输入它,它就能完美运行。谁能看出我做错了什么?

最佳答案

subprocess.Popen接受 args 作为第一个参数。这可以是带有完整命令(包括参数)的字符串:

args = "perl /Users/path/to/Slic3r/slic3r.pl --info /Users/path/to/Desktop/STL_Files/GEAR.stl"
pl_script = subprocess.Popen(args, stdout=sys.stdout)

或包含实际命令及其所有参数的列表(您的实际命令是 perl):

args = ["perl", 
"/Users/path/to/Slic3r/slic3r.pl",
"--info",
"/Users/path/to/Desktop/STL_Files/GEAR.stl"]
pl_script = subprocess.Popen(args, stdout=sys.stdout)

后者是首选,因为它绕过shell,直接执行perl。来自文档:

args should be a sequence of program arguments or else a single string. By default, the program to execute is the first item in args if args is a sequence. If args is a string, the interpretation is platform-dependent and described below. See the shell and executable arguments for additional differences from the default behavior. Unless otherwise stated, it is recommended to pass args as a sequence.

(强调我的)

args 列表当然可以用 Python 的标准列表操作构建:

base_args = ["perl", 
"/Users/path/to/Slic3r/slic3r.pl"]
options = ["--info",
"/Users/path/to/Desktop/STL_Files/GEAR.stl"]
args = base_args + options
args.append("--verbose")
pl_script = subprocess.Popen(args, stdout=sys.stdout)

旁注:您编写了os.system("cd Slic3r")。这将打开一个 shell,更改 那个 shell 中的目录,然后退出。您的 Python 脚本仍将在原始工作目录中运行。要更改它,请改用 os.chdir("Slic3r")。 (参见 here。)

关于python - 在子进程中,某些命令有效,但 Mac 终端中的其他命令无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com