使用变量作为参数的Python子进程调用

4

你好,我对Python还比较新,在尝试使用subprocess.call从另一个Python脚本中调用子进程。但我的参数是变量名。那么,我应该使用subprocess.call还是subprocess.popen?

我想从另一个Python脚本中执行以下命令:

python npp.python -i fname -o fname+"out" -l fname+"log" -e excplist -i ignorelist 

所以,我该怎么做?
subprocess.Popen(['python', 'npp.python', '-i', fname , 'o', fname+"out", '-l', fname+"log", '-e', excplist,'-i',ignrlist]).communicate()

我无法通过这种方式调用其他程序。您有什么建议吗?


3
你的想法是正确的,但是漏掉了-o选项中的一个-符号。 - Martijn Pieters
subprocess.call 基本上就是 subprocess.Popen,但它返回退出代码。请使用 subprocess.Popen。另外,您能说一下出了什么问题吗?为什么代码不能正常工作? - kirbyfan64sos
sh 这个 Python 第三方模块怎么样? - Dreampuf
1个回答

0

仅供参考。 做类似这样的事情的一个非常简单的方法就是事先定义命令,然后将其转换为参数列表。

command = "python npp.python -i {file} -o {file}.out -l {file}.log -e {excep} -i {ignore}".format(file=pipe.quote(fname), excep=exceptlist, ignore=ignorelist)

subprocess.call(shlex.split(command)) # shlex.split is safer for shell commands than the usual split
# or popen if the return code isn't needed
subprocess.Popen(shlex.split(command))

这样以列表形式编写命令时,就更难出现错误了。


1
如果你需要一个列表,就创建一个列表。不要以字符串的形式开始,并将其转换为列表。 - Bryan Oakley
你介意详细说明一下为什么不应该这样做吗?我知道这会给程序增加一个额外的步骤,但它使查看命令变得更加美观。在我看来,它很容易解决在列表形式中创建命令时出现愚蠢语法错误的问题,特别是如果像OP的情况那样很长。许多其他人也是用同样的方式做的:https://dev59.com/_W855IYBdhLWcg3w5InZ - cwoebker
shlex.split() 虽然可以方便地分割动态字符串,但如果命令是静态字符串,在编写代码时自己分割更加经济实惠。虽然这不是特别低效的操作,但从各个部分将其粘合起来,然后再传递给 shlex.split() 显然有点鲁莽。更大的问题也许是您可能会掩盖最终执行的内容。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接