2014-12-03 53 views
0

我想從命令行運行Eclipse來自動化一些項目導入,並且我遇到了pythons子流程的問題。子進程似乎忽略了我的命令參數,直接運行eclipse。使用Eclipse的Python子流程行爲

這裏就是我想要做的事:

subprocess.call(["C:/eclipse/eclipsec", 
       "-nosplash", 
       "--launcher.suppressErrors", 
       "-application org.eclipse.cdt.managedbuilder.core.headlessbuild", 
       "-data", workspace_dir, 
       "-import", project_dir]) 

但是當我運行這個Eclipse的只是打開,並且不執行導入。但是,如果我改變了命令:

subprocess.call(['eclipse_import.bat', workspace_dir, project_dir)]) 

其中eclipse_import.bat是:

set workspace_dir=%1 
set project_dir=%2 

C:/eclipse/eclipsec -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data %workspace_dir% -import %project_dir% 

然後一切行爲完全按照我期望它。

關於什麼會導致差異的任何想法?

回答

1

他們這樣稱呼它應該正常工作,我不知道它爲什麼不是。也許Eclipse試圖以一種奇怪的方式接受你的批處理腳本正確處理的參數,但subprocess.call()沒有,但這完全是我的猜測。

作爲替代方案,你可以嘗試用shell=True參數調用它,讓你的參數列表不是字符串:

call_string = "C:/eclipse/eclipsec -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data {} -import {}".format(workspace_dir, project_dir)) 

subprocess.call(call_string, shell=True) 

這將導致默認的shell來解析參數,而不是在Python本身做,這與您的批處理腳本解決方法非常相似。

1

我想問題是"-application org.eclipse.cdt.managedbuilder.core.headlessbuild"列表元素。你應該在

"-application","org.eclipse.cdt.managedbuilder.core.headlessbuild" 

的一種方式把它拆分看你怎麼必須分割線是利用shlex模塊:

import shlex 
shlex.split('C:/eclipse/eclipsec -nosplash --launcher.suppressErrors -application org.eclipse.cdt.managedbuilder.core.headlessbuild -data workr_dir -import project_dir') 

和PRIT給你的callPopen()

參數列表
['C:/eclipse/eclipsec', '-nosplash', '--launcher.suppressErrors', '-application', 'org.eclipse.cdt.managedbuilder.core.headlessbuild', '-data', 'workr_dir', '-import', 'project_dir'] 
+0

我標記了另一個答案作爲正式答案,但您的解決方案也工作得很好 – lucasbrendel 2014-12-03 21:52:25