我正在尝试使用python子进程运行ant作业。以下是我正在尝试执行的命令。
ant -f ../lib/java/build.xml -Dno-gen-thrift="" -Dtestargs "--protocol=binary --transport=buffered" run-testserver
但是当我使用子程序使用以下命令运行它时
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'])
这是什么原因?
答案 0 :(得分:2)
在您将在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可执行文件,然后使用某种方法再次解析它们,然后Python应用程序代码再次解析参数使用某种方法。在您的情况下,Python的子进程模块在使用系统调用生成新进程之前使用某种方法创建参数数据,这引入了更多的复杂性。总而言之,结果可能是意外行为,您可能必须调整命令行,以便以某种方式使Ant理解正确的事情。这可能很棘手。
答案 1 :(得分:0)
当我使用以下内容时,它对我有用,
subprocess.call(['ant','-f','lib/java/build.xml','-Dno-gen-thrift=\"\"','-Dtestargs', '\"--protocol=binary', '--transport=buffered\"','run-testserver'])