使用Eclips的Python子进程行为

2024-09-30 18:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从命令行运行Eclipse来自动导入一些项目,但是pythons子进程有一个问题。子进程似乎忽略了我的命令参数,直接运行eclipse。在

以下是我要做的:

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

但是当我运行这个Eclipse时,它只是打开而不执行导入。但是,如果我将命令更改为:

^{pr2}$

其中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%

然后一切都会像我期望的那样。在

关于什么会导致这些差异呢?在


Tags: orgimport命令projectapplication进程dirworkspace
2条回答

我假设问题是"-application org.eclipse.cdt.managedbuilder.core.headlessbuild"列表元素。你应该把它分成两半

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

了解如何分割行的一种方法是使用shlex模块:

^{pr2}$

并将其提供给您callPopen()的参数列表

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

你称它为应该正常工作,我不知道为什么不行。也许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中本机执行,这与批处理脚本的解决方法非常相似。在

相关问题 更多 >