从命令行运行Ecplise/PyDev项目

3
我正在用Python开发一个系统,包括计算引擎和前端。我将它们分成两个项目,因为计算引擎也可以用于其他前端。
我在使用Eclipse和PyDev。在Eclipse/PyDev中一切正常,但是一旦我尝试在PyDev之外的环境下运行它(从命令行),就会出现导入错误。我已经做了很多研究来找到问题所在,但我找不到一个好的解决方案。我相信PyDev修改了Python路径。
在我的项目布局中,我有一个项目(Calculations)中的两个包(package1和tests)。我无法从tests中导入package1中的任何内容。我还有另一个项目(Frontend)。在这里,我也无法从package1中导入任何内容。
我想要了解的是从命令行调用我的脚本/测试文件的正确方式?无论是两个单独的项目还是同一个项目中的两个包,我认为应该类似于PyDev的调用方式。到目前为止,我认为有以下几种选择:
  • 创建python代码以追加到sys.path(看起来很hacky/不是很好的实践)
  • 当我像这样调用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

欢迎对我的项目布局提出意见。

2个回答

2
一种干净、快速和模块化的方法,在任何地方包含特定的 Python 模块,是创建一个名为 mymodule.pth 的文件,并将其放置在 site-packages 路径下。
mymodule.pth 应该有你的项目路径。项目文件夹必须有一个 __init__.py 文件。
例如,将以下内容放入:
对于 Linux: /home/user/myproject 在此位置: /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 - Kritz
唯一的缺点是你需要为每个用户都这样做。我的解决方案是系统级的。(并且可以通过 rm mymodule.pth 轻松删除) - PanGalactic

0
我编写了一个脚本,可以从PyDev的项目属性中加载PYTHONPATHs。这样您就可以在控制台上运行代码,而无需出现“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)

希望能对您有所帮助 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接