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

2024-04-24 18:48:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但是当我使用下面的命令使用子进程运行这个

^{pr2}$

我在说“未知参数:--传输=缓冲”时出错。在

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'是命令行参数,被解析为使用这个ant脚本执行的java类。 当我只发送一个争论时,下面的命令运行时没有任何问题。在

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

这是什么原因?在


Tags: run命令buildlibxmljavaprotocolthrift
2条回答

在最初的命令行中,你可以直接在shell中运行

-Dtestargs " protocol=binary  transport=buffered"

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

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

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

当我使用以下方法时,它对我有效

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

相关问题 更多 >