【问题标题】:subprocess.Popen not parsing arguments correctlysubprocess.Popen 没有正确解析参数
【发布时间】:2014-03-19 02:36:59
【问题描述】:

我一直在玩subprocess.Popen 来执行一个程序,但一直没有想出正确的方法来传递参数。

这是一个应该执行我的程序的简化代码sn-p:

subprocess.Popen(shlex.split('dflat --portfolio jumpy --seed 1 --tables -n semi --elimination min-degree -e edge --default-join -p ../test_encodings/exchange.lp'))

shlex.split(...)的输出:

['dflat', '--portfolio', 'jumpy', '--seed', '1', '--tables', '-n', 'semi', '--elimination', 'min-degree', '-e', 'edge', '--default-join', '-p', '../test_encodings/exchange.lp']

但是,被调用的程序未能告诉我我需要提供一个程序(-p 选项),正如您在上面看到的那样。

虽然从 shell 运行命令效果很好。

【问题讨论】:

  • 这是一个 SSCCE 非常宝贵的地方。见sscce.org
  • 根据 cmets 的说法,这个问题是不可重现的。投票结束。

标签: python subprocess command-line-arguments


【解决方案1】:

如果您可以提供其他人可以运行的复制器(而不是需要非标准 dflat 程序的东西),那将会很有帮助。

一般来说,您发布的方法应该可行。也就是说,自己拆分数组更传统,更不容易出错,并且可以说更具可读性。

subprocess.Popen([
    'dflat',
    '--portfolio', 'jumpy',
    '--seed', '1',
    '--tables',
    '-n', 'semi',
    '--elimination', 'min-degree',
    '-e', 'edge',
    '--default-join',
    '-p', '../test_encodings/exchange.lp'])

手动执行此操作意味着您可以将每个本身带有参数的选项与该参数放在同一行,从而提高可读性。这也意味着如果您的参数包含文字空格、引号等,您可以避免引用问题。使用shlex.split() 可以解决您只是将文字字符串作为第一个参数传递并使用@987654324 时遇到的问题的一个子集@ -- 尽管稍微少一些,因为您不必担心内容被误解为重定向字符、管道、复合命令、命令间接等。

【讨论】:

  • 同意。然后你也可以玩弄参数,看看 dflat 是否期望 -p 与 file 参数在同一个字符串中混为一谈,或者类似的奇怪的东西。
  • 谢谢,我已经检查过了,我对任何其他程序都没有任何问题,所以似乎是 dflat 程序导致了问题。
【解决方案2】:

您问题中的命令似乎正确。确保您的代码使用完全相同的代码,没有任何更改。

我的猜测是 --default-join 选项会吃掉 -p 参数。您可以通过在命令末尾移动--default-join 来测试它。

还要确保从正确的目录启动脚本。 -p 值是相对路径。检查文件是否可访问。

【讨论】:

  • 您好,谢谢,这似乎是 dflat 的问题,路径是绝对的,我只是将它们更改为相对路径,因为我想省去您浏览完整工作树的麻烦。
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多