python包装相对import

首先:我很抱歉,我知道有很多关于相关import的问题,但我没有find解决办法。 如果可能的话,我想使用以下目录布局:

myClass/ __init__.py test/ demo.py benchmark.py specs.py src/ __init__.py myClass.py 

现在我的问题是:

  • 如何从包内的testing文件正确导入myClass.py?

  • 假如你在libs / myClass或者include / myClass中把myClass作为子模块,你会如何从外部导入包?

到目前为止,我找不到一个优雅的解决scheme。 从我所了解的Guido的决定 ,应该可以from ..src import myClass但是这将会出错:

ValueError: Attempted relative import in non-package

看起来它不会把myClass当成包。 阅读文档 :

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

看来我缺less一些指定软件包脚本的地方,我应该使用.pth吗?

ValueError: Attempted relative import in non-package

意思是你试图在不是包的模块中使用相对导入。 它与from ... import语句的文件有问题,而不是你想要导入的文件。

因此,如果您在testing中进行相对导入,则应将testing作为软件包的一部分。 意即

  1. 添加__init__.py来testing/
  2. 从外部脚本运行它们,如鼻子testing

如果你运行的是python myClass/test/demo.py ,相对导入将不会工作,因为你正在运行demo模块而不是package。 相对导入要求使用它们的模块自己作为包模块from myClass.test.demo import blablafrom myClass.test.demo import blabla或者相对导入。

昨晚经过几个小时的search,我find了python相对导入的答案! 或者至less是一个简单的解决scheme。 解决这个问题的最好方法是从另一个模块调用模块。 所以说你想demo.py导入myClass.py在MyClass文件夹中的子包玩具的根目录需要有一个文件,调用另外两个。 从我收集的工作目录总是被认为是主要的,所以如果你用demo.py脚本testingdemo.py的导入,你将会收到这个错误。 为了显示:

文件夹层次:

 myClass/ main.py #arbitrary name, can be anything test/ __init__.py demo.py src/ __init__.py myClass.py 

myClass.py:

 def randomMaths(x): a = x * 2 y = x * a return y 

demo.py:

 from ..src import myClass def printer(): print(myClass.randomMaths(42)) 

main.py:

 import test.demo demo.printer() 

如果你在解释器中运行demo.py,你会产生一个错误,但是运行main.py不会。 这是一个有点复杂,但它的作品:D

内部包引用描述了如何从test/*获取myClass 。 要从外部导入软件包,应在运行导入器应用程序之前将其path添加到PYTHONPATH环境variables,或者在导入之前将其path添加到代码中的sys.path列表中。

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