subprocess.call没有按预期运行

时间:2012-04-09 13:04:56

标签: 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.forOPTICSAndDBScan.Databases.SequentialDatabase'
9 db_dist='weka.clusterers.forOPTICSAndDBScan.DataObjects.EuclidianDataObject'

...

28   traindir = './arff_dir/'
29   trainfile = 'of3_O_0_0.arff'
30   trainer = traindir + trainfile

...

45       subprocess.call([java1, java2, java3, weka_args, '-E', str(eps), '-M', str(min), '-I', db_type, '-D', db_dist, '-t', trainer], shell=True)

其中eps和min分别为0.12510

执行我的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.

之后进一步输出。这是在将java简单地输入bash shell时得到的完全相同的输出。这让我相信,不知何故,subprocess.call并没有读取每一个参数。是这种情况吗?我应该如何正确评估此命令?

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

1 个答案:

答案 0 :(得分:0)

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

我对Java一无所知,但我敢打赌你给它错误的参数,输出错误告诉我们什么都没有(除了找到java并且它没有得到正确的参数,它没有'这意味着它没有得到任何东西。

尝试调试传递给subprocess.call的字典(即使使用简单的打印或import pdb并调用pdb.set_trace()以获取上一行中的调试器),并检查命令是否这些参数按预期工作。

我知道这不是一个正确的答案,但这对评论界来说太长了。