Java subprocess.call未按预期操作

Java subprocess.call未按预期操作,java,python,bash,weka,Java,Python,Bash,Weka,我试图通过以下代码用python重复执行一个外部程序 3 javarun='java -classpath /home/jrm6u/code/weka_dir/weka.jar' 4 java1='java' 5 java2='-classpath' 6 java3='/home/jrm6u/code/weka_dir/weka.jar' 7 weka_args='weka.clusterers.DBScan' 8 db_type='weka.clusterers.forOPTICSAndDBS

我试图通过以下代码用python重复执行一个外部程序

3 javarun='java -classpath /home/jrm6u/code/weka_dir/weka.jar'
4 java1='java'
5 java2='-classpath'
6 java3='/home/jrm6u/code/weka_dir/weka.jar'
7 weka_args='weka.clusterers.DBScan'
8 db_type='weka.clusterers.forOPTICSAndDBScan.Databases.SequentialDatabase'
9 db_dist='weka.clusterers.forOPTICSAndDBScan.DataObjects.EuclidianDataObject'

其中eps和min分别为
0.125
10

在执行python代码时,出现以下错误:

Usage: java [-options] class [args...]
       (to execute a class)
or  java [-options] -jar jarfile [args...]
       (to execute a jar file)
where options include:
-d32          use a 32-bit data model if available
-d64          use a 64-bit data model if available
-server       to select the "server" VM
              The default VM is server.
之后再进一步输出。这与我在bashshell中输入
java
时得到的输出完全相同。这使我相信,不知何故,subprocess.call并没有读取每个参数。是这样吗?我应该如何让它正确评估此命令


请注意,此命令可以正确地手动输入shell,但使用此脚本的动机是让它循环通过
min
eps
的值以及训练文件,以便我可以自动执行这些命令。

我不认为它忽略了参数,但除非必要,否则我会尽量避免使用Shell参数,有时它会有奇怪的行为(与命令行解析相关,而不是python)

我对Java一无所知,但我敢打赌你给它的参数是错误的,输出错误没有告诉我们任何事情(除了找到
Java
,它没有得到正确的参数,这并不意味着它没有得到任何参数)

尝试调试传递给subprocess.call的字典(即使是通过简单的打印或导入pdb和调用
pdb.set_trace()
来获取前一行中的调试器),并检查带有这些参数的命令是否按预期工作


我知道这不是一个正确的答案,但这对于注释行来说太长了。

您知道,您可以将参数格式化为一个字符串。尝试在shell中运行的字符串,看看会发生什么。问题是我想更改一些参数,所以我将它们拆分,以便更容易更改。java1、java2、java3最初是一个字符串,发生了相同的问题,使我将它们拆分。您始终可以使用
%s%s..“
自己进行格式化,但我建议作为调试步骤,而不是解决方案。此外,我还将java参数更改为java可执行文件的确切路径。顺便说一句,值得注意的是,您可以在不使用jython的情况下集成python和java,使用以下库:
javarun
arg包含确切的路径,以及
java3
,当我将其作为一个字符串时,它确实可以工作。。。有什么问题吗?你不应该在这里使用
shell=True
——它完全取消了你手动拆分参数列表的工作,并以一种可能正确也可能不正确的方式重新处理它。如果它在
shell=False
时找不到
java
,那么您的操作系统环境会有一些有趣的地方(在这种情况下仍然应该搜索路径,并且通常会包含正确的内容),识别/修复潜在问题会更好,但是您可以尝试将显式完整路径传递给
java
可执行文件作为权宜之计。我使用shell=True命令,因为如果我不这样做,它会告诉我
OSError:[Errno 2]没有这样的文件或目录
@Laurbert515,我想您会遇到这个错误,因为“java”不在您的路径中,尝试使用java的完整路径或将“java”添加到系统范围内的路径。
45       subprocess.call([java1, java2, java3, weka_args, '-E', str(eps), '-M', str(min), '-I', db_type, '-D', db_dist, '-t', trainer], shell=True)
Usage: java [-options] class [args...]
       (to execute a class)
or  java [-options] -jar jarfile [args...]
       (to execute a jar file)
where options include:
-d32          use a 32-bit data model if available
-d64          use a 64-bit data model if available
-server       to select the "server" VM
              The default VM is server.