【问题标题】:Subprocess call with arguments as variables python [duplicate]使用参数作为变量python的子进程调用[重复]
【发布时间】:2013-06-20 18:35:38
【问题描述】:

您好,我对 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()

这样做我无法调用其他程序。关于我做错了什么的任何建议?

【问题讨论】:

  • 您的想法是对的,但在-o 选项上缺少-
  • subprocess.call 基本上是subprocess.Popen,但它返回退出代码。使用subprocess.Popen。另外,你能说一下怎么回事吗?为什么代码不起作用?
  • python第三个模块sh呢?

标签: python subprocess


【解决方案1】:

P仅供参考。 执行此类操作的一种非常简单的方法是预先定义命令,然后将其转换为参数列表。

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))

这样在以列表形式编写命令时更不容易出错。

【讨论】:

  • 如果您需要列表,请创建一个列表。不要以字符串开头,然后将其转换为列表。
  • 您介意详细说明为什么不应该执行上述操作。我知道它为程序增加了一个额外的步骤,但它使查看命令变得更好。在我看来,它很容易解决在以列表形式创建命令时出现愚蠢的语法错误的问题,尤其是在 OPs 的情况下。许多其他人也在这样做:stackoverflow.com/questions/4091242/…
  • shlex.split() 方便拆分动态字符串,但是如果命令是静态字符串,写代码的时候自己拆分比较省钱。不过,这并不是一个巨大的低效率。但是仅将其从零件粘合在一起然后将其传递给shlex.split()显然有点鲁莽。更大的问题可能是你掩盖了你最终执行的内容。
猜你喜欢
  • 2016-02-12
  • 1970-01-01
  • 2017-02-19
  • 2013-08-04
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多