我正在尝试创建一个在Mac终端上运行perl脚本的python脚本。流行的3D打印机切片引擎Slic3r具有使用命令行使用的能力,这是用Perl编写的。我想编写一个python脚本来自动化一些进程,这是我最熟悉的语言。如果我将想要使用的命令直接输入到终端中,它就会正常工作,但是,如果我尝试使用python的subprocess,它可以用于某些命令,而不是其他命令。
例如,如果我使用我的脚本使用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语法是正确的,因为如果我将它直接输入到终端中,它就能很好地工作。有人能看出我做错了什么吗?
发布于 2017-12-29 07:26:34
您还可以使用shlex来分解复杂的参数,特别是在mac或unix中。
更多信息,在这里https://docs.python.org/2/library/shlex.html#shlex.split
例如:
import shlex, subprocess
args = "perl /Users/path/to/Slic3r/slic3r.pl --info /Users/path/to/Desktop/STL_Files/GEAR.stl"
#using shlex to break down the arguments
mac_arg=shlex.split(args)
#shlex.split will return all the arguments in a list输出
['perl', '/Users/path/to/Slic3r/slic3r.pl', '--info', '/Users/path/to/Desktop/STL_Files/GEAR.stl']这可以进一步与Popen一起使用。
p1=Popen(mac_arg)Shlex main adavantage是,您不需要担心命令,它总是以Popen接受的方式将命令拆分。
https://stackoverflow.com/questions/48010233
复制相似问题