【问题标题】:Is it possible to run PyDev code analysis from the command line?是否可以从命令行运行 PyDev 代码分析?
【发布时间】:2012-07-31 01:25:26
【问题描述】:

我正在尝试运行无头 Eclipse 构建,但我被卡住了。我的上下文是我想使用 PyDev 代码分析而不必启动 eclipse gui。我知道其他用于进行代码分析的命令行工具(pyflakes、pylint 等)。

我目前的命令是:

java -jar /path/to/eclipse/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar -noSplash -data "/path/to/workspace" -application org.eclipse.jdt.apt.core.aptBuild

我的java版本是1.6.0_31,我的eclipse版本是3.7.2,我的pydev版本是2.5.0。

当我运行该命令时,它看起来正在运行,但它从未捕获任何错误或警告。

...
PyDev: Analyzing 29 of 33 (forms.py)
PyDev: Analyzing 29 of 33 (forms.py)
PyDev: Analyzing 29 of 33 (forms.py)
PyDev: Analyzing 29 of 33 (forms.py)
...

如果我tail -f /path/to/workspace/.metadata/.log,我会得到一个巨大的堆栈跟踪:

!ENTRY org.eclipse.equinox.preferences 4 2 2012-07-30 17:48:39.612
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.equinox.preferences".
!STACK 0
java.lang.ExceptionInInitializerError
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.setDefault(DebugUIPreferenceInitializer.java:186)
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.setThemeBasedPreferences(DebugUIPreferenceInitializer.java:204)
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.initializeDefaultPreferences(DebugUIPreferenceInitializer.java:79)
    at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper$1.run(PreferenceServiceRegistryHelper.java:281)
..... TRUNCATED ......

!ENTRY org.eclipse.osgi 4 0 2012-07-30 17:48:39.622
!MESSAGE An error occurred while automatically activating bundle org.eclipse.debug.ui (42).
!STACK 0
org.osgi.framework.BundleException: Exception in org.eclipse.debug.internal.ui.DebugUIPlugin.start() of bundle org.eclipse.debug.ui.
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
..... TRUNCATED .......

java.lang.IllegalStateException: Workbench has not been created yet.
    at org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:92)
    at org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager.startup(LaunchingResourceManager.java:546)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.getLaunchingResourceManager(DebugUIPlugin.java:315)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.start(DebugUIPlugin.java:516)
..... TRUNCATED ......

!ENTRY org.eclipse.osgi 4 0 2012-07-30 17:48:39.624
!MESSAGE An error occurred while automatically activating bundle org.eclipse.debug.core (41).
!STACK 0
org.osgi.framework.BundleException: Exception in org.eclipse.debug.core.DebugPlugin.start() of bundle org.eclipse.debug.core.
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
..... TRUNCATED ......

我怀疑 PyDev 需要 gui 来呈现错误/警告。

【问题讨论】:

    标签: eclipse pydev code-analysis


    【解决方案1】:

    PyDev 需要 gui 来呈现错误/警告,并且通常它没有在命令行中使用......现在,话虽如此,它确实具有运行代码分析的单元测试,而不需要gui(甚至没有加载 eclipse),但您必须在内存中配置解释器/项目才能使其工作。

    见:

    https://github.com/aptana/Pydev/blob/development/plugins/com.python.pydev.analysis/tests/com/python/pydev/analysis/OccurrencesAnalyzerTest.java

    https://github.com/aptana/Pydev/blob/development/plugins/com.python.pydev.analysis/tests/com/python/pydev/analysis/AnalysisTestsBase.java

    对于进行代码分析而不需要加载 Eclipse 工作台的测试(即:甚至不需要无头运行 Eclipse ——它可以作为一个简单的 Java 程序运行,但您仍然必须在 CLASSPATH 中使用 PyDev 执行 java main([]),并使用其 API 正确设置 PyDev 中使用的解释器以及项目/pythonpath)。

    您可以查看测试的设置(即:不要忘记查看超类,例如 CodeCompletionTestsBase/AnalysisTestsBase)。

    注意:如果您确实创建了这样的 main([]),请为 PyDev 提供补丁,因为它可能会被其他人使用...

    作为一个实现说明,这样的 main 可能应该从正在启动的 shell 收集所有当前 PYTHONPATH 条目并在解释器中配置所有这些条目......此外,它可能应该接收一个目录作为参数,以便它分析树中的所有文件(启动可能会花费你大部分时间来配置东西,所以,理想情况下,你可以从一次运行中分析尽可能多的文件,因为 PyDev 代码分析是为了缓存很多东西在启动时,然后使用 RAM 中的信息——或者创建一个始终处于活动状态的服务器进程?)。

    【讨论】: