2012-04-09 32 views
0

我試圖多次通過下面的代碼執行蟒外部程序...subprocess.call不作爲預期

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並不是讀取每一個參數。這是什麼情況?我應該如何去正確評估這個命令?

注意,這個命令可以正確地手動輸入到外殼,但背後使用這個腳本的動機是有它遍歷的mineps值以及培訓文件,這樣我就可以自動執行這些。

+0

你知道你可以將參數格式化爲一個字符串。嘗試你在shell中運行的確切字符串,看看會發生什麼。 – 2012-04-09 13:11:08

+0

這個問題是,我想改變一些參數,所以我將它們分開,使它們更容易改變。 java1,java2,java3最初是一個字符串,並且發生了同樣的問題,這使我拆分了它們 – drjrm3 2012-04-09 13:41:54

+0

你總是可以用''%s%s%s ...''來自己格式化,但是我建議把它作爲一個調試一步,而不是解決方案。另外,我會將java arg更改爲java可執行文件的確切路徑。順便說一句,值得注意的是,你可以在不使用jython的情況下集成python和java,使用這個庫:http://jpype.sourceforge.net/或者這個:https://github.com/thouis/Python-Java-Bridge – 2012-04-09 13:54:07

回答

0

我不認爲這是忽略參數,但我會盡量避免殼參數,除非必要,有時它有奇怪的行爲(命令行解析相關,而不是python)。

我對Java一無所知,但我敢打賭,你給它的參數是錯誤的,輸出錯誤告訴我們什麼都沒有(除了發現java,它沒有得到正確的參數,並不意味着它是沒有得到任何)。

嘗試調試要傳遞到subprocess.call(即使是一個簡單的打印或import pdb並電話pdb.set_trace()在前面的一線得到一個調試器),並檢查是否與這些參數的命令正在按預期字典。

我知道這不是一個正確的答案,但對評論欄來說這太長了。

+0

我使用shell = True命令,因爲如果我不告訴我'OSError:[Errno 2]沒有這樣的文件或目錄' – drjrm3 2012-04-09 14:50:54

+0

@ Laurbert515我認爲你得到的錯誤是因爲'java'不在你的PATH,嘗試使用java的完整路徑或將'java'添加到PATH系統範圍。 – KurzedMetal 2012-04-09 14:55:41