【问题标题】:Run Ecplise/PyDev project from command line从命令行运行 Eclipse/PyDev 项目
【发布时间】:2015-11-21 08:20:02
【问题描述】:

我正在用 Python 开发一个系统,其中包括一个计算引擎和一个前端。我将它们分成两个项目,因为计算引擎也可以用于其他前端。

我正在使用 Eclipse 和 PyDev。一切都在 Eclipse/PyDev 中完美运行,但是一旦我尝试在 PyDev 之外(从命令行)运行它,我就会遇到导入错误。我已经做了很多研究来找到问题,但我只是没有看到一个很好的解决方案。我相信 PyDev 修改了 Python 路径。

在下面的项目布局中,我在一个项目(计算)中有两个包(package1 和测试)。我似乎无法在测试中从 package1 导入任何东西。我还有另一个项目(前端)。在这里我也无法从 package1 导入任何东西。

我想了解的是从命令行调用我的脚本/测试文件的正确方法?两个单独的项目和同一个项目中的两个包。我认为它类似于 PyDev 的做法。到目前为止,我认为我有以下选择:

  • 创建要附加到 sys.path 的 python 代码(看起来很老套/不好的做法)
  • 当我像这样调用 test_some_calc.py 时修改 PYTHONPATH:PYTHONPATH= python test_some_calc.py(我认为这就是 PyDev 的做法,但似乎有点长 - 必须有更简单的方法?
  • 制作一个安装包(最终我可能会采用这种方法,但还没有。)

我有以下项目布局。

CodeSolution/
    Calculations/
       package1/
           __init__.py
           subpackage/
               __init__.py
               some_calc.py
           subpackage2/
               __init__.py
               another_calc.py
       tests/
           __init__.py
           subpackage/
               __init__.py
               test_some_calc.py  # Unable to import from package1
           subpackage2/
               __init__.py
               test_another_calc.py  # Unable to import from package1
    Frontend/
        some_script.py  # Unable to import from package1

对我的项目布局的评论也将不胜感激。

【问题讨论】:

    标签: python eclipse pydev


    【解决方案1】:

    从系统的任何位置包含某些 python 的一种干净、快速和模块化的方法是创建一个名为 mymodule.pth 的文件并将其放在站点包的路径中

    mymodule.pth 应该有你的项目的路径。项目文件夹必须有一个 __init__.py 文件。

    例如放:

    对于 Linux

    /home/user/我的项目

    里面

    /usr/lib/python2.7/site-packages/mymodule.pth

    适用于 Windows

    C:\\Users\myUsername\My Documents\myproject

    里面

    C:\PythonXY\Lib\site-packages\mymodule.pth

    【讨论】:

    • 谢谢,我还发现我可以在打开新终端时运行一次:export PYTHONPATH=$PYTHONPATH:/home/dev/python-files
    • 唯一的缺点是您应该为每个用户都这样做。我的解决方案是系统方面的。 (并且可以使用 rm mymodule.pth 轻松删除)
    【解决方案2】:

    我编写了一个脚本来从 PyDev 的项目属性中加载 PYTHONPATH。它允许您从控制台运行代码,而不会出现“ModuleNotFoundError: No module named ...”之类的问题。

    import sys
    from xml.dom import minidom
    import os
    
    print(sys.path)
    def loadPathsFromPyDev():
        sys_path = sys.path[0]
        # Load XML
        xmldoc = minidom.parse(sys_path+'\.pydevproject')
        # Get paths
        xmlpaths = xmldoc.getElementsByTagName('path')
        # Get paths' values
        paths = list()    
        for xmlpath in xmlpaths:
            paths.append(xmlpath.firstChild.data)
        # set path variable
        for path in paths:
            # Set backslashes to forwardslashes
            path = os.path.normpath(path)
            # Set string's sys_path
            path = path.replace("\${PROJECT_DIR_NAME}", sys_path)
            if path not in sys.path:
                # Add to system path
                sys.path.insert(1,path)
    
    loadPathsFromPyDev()
    print(sys.path)
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多