2014-12-03 3 views
0

Я пытаюсь запустить Eclipse из командной строки для автоматизации импорта некоторых проектов, и у меня проблема с подпроцессом pythons. Подпроцесс, похоже, игнорирует мои аргументы команды и просто запускает eclipse прямо вверх.Поведение подпроцесса Python с Eclipse

Вот что я пытаюсь сделать:

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) 

Это заставит вашу оболочку по умолчанию для разбора аргументов вместо того, чтобы делать это изначально в 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') 

и Прит это даст вам список аргументов для call или Popen()

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

Я ответил на другой ответ в качестве официального ответа, но ваше решение сработало – lucasbrendel

Смежные вопросы