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

0 投票
2 回答
1179 浏览
提问于 2025-04-18 15:22

我正在尝试用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 个回答

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 理解正确的内容。这可能会有点棘手。

0

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

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

撰写回答