用于相对进口的python包装

eer*_*rne 70 python python-import

首先关闭所有:对不起,我知道有很多关于相关进口的问题,但我没有找到解决方案.如果可能,我想使用以下目录布局:

myClass/
    __init__.py
    test/
        demo.py
        benchmark.py
        specs.py
    src/
        __init__.py
        myClass.py
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:

  • 包中的测试文件如何正确导入myClass.py?

  • 如果你将libC/myClass中的myClass作为子模块或者包含/ myClass,你将如何从外部导入包?

到目前为止,我找不到一个优雅的解决方案.根据我的理解,Guido的决定应该可以做,from ..src import myClass但这会出错:

ValueError: Attempted relative import in non-package

看起来它不会将myClass视为包.阅读文档:

需要__init__.py文件才能使Python将目录视为包含包;

我似乎缺少一些指定包的脚本的东西,我应该使用.pth吗?

Dan*_*uev 42

ValueError: Attempted relative import in non-package

表示您尝试在非包的模块中使用相对导入.它的问题与具有此from ... import语句的文件有关,而不是您尝试导入的文件.

因此,例如,如果您在测试中进行相对导入,则应将测试作为包的一部分.这意味着

  1. 添加__init__.py到测试/
  2. 从一些外部脚本运行它们,如nosetests

如果你运行的东西python myClass/test/demo.py,相对导入也不会工作,因为你运行演示模块不是作为包.相对导入要求使用它们的模块本身作为包模块from myClass.test.demo import blabla或相对导入导入.


Sev*_*325 27

昨晚经过几个小时的搜索,我找到了python相对进口的答案!! 或者至少是一个简单的解决方案.解决此问题的最佳方法是从另一个模块调用模块.所以说你要demo.py导入myClass.py.在myClass子包的根目录下的文件夹中,他们需要有一个调用其他两个文件的文件.从我收集的工作目录始终考虑__main__如此,如果您demo.py使用demo.py脚本测试导入,您将收到该错误.为了显示:

文件夹层次:

myClass/
    main.py #arbitrary name, can be anything
    test/
        __init__.py
        demo.py
    src/
        __init__.py
        myClass.py
Run Code Online (Sandbox Code Playgroud)

myClass.py:

def randomMaths(x):
    a = x * 2
    y = x * a
    return y
Run Code Online (Sandbox Code Playgroud)

demo.py:

from ..src import myClass

def printer():
    print(myClass.randomMaths(42))
Run Code Online (Sandbox Code Playgroud)

main.py:

import test.demo

demo.printer()
Run Code Online (Sandbox Code Playgroud)

如果您demo.py在解释器中运行,则会生成错误,但main.py不会运行.这有点令人费解,但它有效:D

  • 我正在使用Python 2.7,我只通过做三件事来完成上述代码.首先,在main.py所在的级别,我添加了一个`__init __.py`.其次,我将demo.printer()更改为`test.demo.printer()`.第三,我更改了main.py上面的目录并运行了`python -m myClass.main`.否则,这对我来说是一个非常有用的答案.:) (3认同)

kha*_*hik 0

包内引用描述了如何myClasstest/*. 要从外部导入包,您应该PYTHONPATH在运行导入器应用程序之前将其路径添加到环境变量中,或者sys.path在导入之前在代码中列出。

为什么from ..src import myClass失败:可能src不是 python 包,你无法从那里导入。您应该如上所述将其添加到 python 路径中。