使用python子进程运行ant脚本时出错



我正在尝试使用python子进程运行蚂蚁作业。下面是我要执行的命令。

ant -f ../lib/java/build.xml -Dno-gen-thrift="" -Dtestargs "--protocol=binary --transport=buffered" run-testserver

但是当我使用以下命令

运行subprocess时
subprocess.call(['ant','-f','lib/java/build.xml','-Dno-gen-thrift=""','-Dtestargs "--protocol=binary --transport=buffered"','run-testserver'])

我得到错误说"未知参数:——transport=buffered"。

Unknown argument: --protocol=binaty
ant [options] [target [target2 [target3] ...]]
Options: 
  -help, -h              print this message
  -projecthelp, -p       print project help information  ...........

这里'——protocol=binary'和'——transport=buffered'是解析到java类的命令行参数,使用这个ant脚本执行。当我只发送一个参数时,下面的命令也没有任何问题。

subprocess.call(['ant','-f','lib/java/build.xml','-Dno-gen-thrift=""','-Dtestargs "--protocol=binary"','run-testserver'])
subprocess.call(['ant','-f','lib/java/build.xml','-Dno-gen-thrift=""','-Dtestargs "--transport=buffered"','run-testserver'])

这是什么原因?

在shell中运行的原始命令行中,

-Dtestargs "--protocol=binary --transport=buffered"

实际上是两个命令行参数。shell解析第二个参数的外部双引号,并提供字节字符串--protocol=binary --transport=buffered作为ant可执行文件的参数。Ant不再看到双引号。您应该对subprocess复制相同的内容,并且而不是提供'-Dtestargs "--protocol=binary --transport=buffered"'作为单个参数,包括双引号。提供两个独立的参数,即两个列表项,一个是'-Dtestargs',另一个是'--protocol=binary --transport=buffered'

老实说,这只是一个有根据的猜测,但我很确定这是你问题的一部分。

另外,您应该注意命令行解析可能是一个相当微妙的问题。争论经过不同的层次,可能彼此都不知道。例如,当您通过shell运行Python命令时,shell首先使用特定方法解析参数,将它们提供给CPython可执行文件,CPython可执行文件使用特定方法再次解析它们,然后Python应用程序代码再次使用特定方法解析参数。在您的示例中,Python的subprocess模块在使用系统调用生成新进程之前使用某个方法创建参数数据,这引入了更多的复杂性。总而言之,结果可能是意想不到的行为,您可能必须调整命令行,以便以某种方式使Ant理解正确的事情。

当我使用以下命令时,

subprocess.call(['ant','-f','lib/java/build.xml','-Dno-gen-thrift=""','-Dtestargs', '"--protocol=binary', '--transport=buffered"','run-testserver'])

相关内容

  • 没有找到相关文章