使用Python子进程运行ant脚本时出错
我正在尝试用Python的subprocess模块来运行一个ant任务。下面是我想执行的命令。
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类的命令行参数,这个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'])
这是什么原因呢?
2 个回答
在你最开始的命令行中,也就是你在终端里直接运行的那条命令,
-Dtestargs "--protocol=binary --transport=buffered"
实际上有两个命令行参数。终端会把第二个参数中的外层双引号去掉,然后把字节串 --protocol=binary --transport=buffered
作为参数传给 ant 执行文件。Ant 这时候就看不到双引号了。你在使用 subprocess
时也要做到这一点,不要把 '-Dtestargs \"--protocol=binary --transport=buffered\"'
当作一个整体的参数(包含双引号)来传。你应该提供两个独立的参数,也就是两个列表项,一个是 '-Dtestargs'
,另一个是 '--protocol=binary --transport=buffered'
。
老实说,这只是我的一个推测,但我很确定这和你遇到的问题有关系。
另外,你要注意,命令行参数的解析可能会比较复杂。参数会经过不同的层次处理,这些层次之间可能并不知道对方的存在。比如,当你通过终端运行一个 Python 命令时,终端首先用某种方法解析参数,然后把它们传给 CPython 执行文件,CPython 再用另一种方法解析这些参数,最后 Python 应用程序代码又会用某种方法解析参数。在你的情况下,Python 的 subprocess 模块在使用系统调用创建新进程之前,会用某种方法生成参数数据,这就增加了更多的复杂性。总的来说,结果可能会导致一些意想不到的行为,你可能需要调整你的命令行,以便让 Ant 理解正确的内容。这可能会有点棘手。
我用以下方法时,它对我有效,
subprocess.call(['ant','-f','lib/java/build.xml','-Dno-gen-thrift=\"\"','-Dtestargs', '\"--protocol=binary', '--transport=buffered\"','run-testserver'])