我来过这里:
还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.
永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Run Code Online (Sandbox Code Playgroud)
我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:
相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.
上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.
有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.
编辑:导入是从控制台完成的.
我不理解pep-0404的以下内容
在Python 3中,包中的隐式相对导入不再可用 - 仅支持绝对导入和显式相对导入.此外,星型导入(例如来自x import*)仅允许在模块级代码中使用.
什么是相对进口?在python2中允许星形导入的其他地方?请举例说明.
我有以下目录:
mydirectory
??? __init__.py
??? file1.py
??? file2.py
Run Code Online (Sandbox Code Playgroud)
我有一个在file1.py中定义的函数f.
如果,在file2.py中,我这样做
from .file1 import f
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
SystemError:父模块''未加载,无法执行相对导入
为什么?以及如何使它工作?
我正在制作一个包,这个包中的模块在if __name__=='__main__':块中包含用于测试目的的代码。但是我尝试在这些模块中使用相对导入会导致错误。
我已经阅读了这个帖子和其他十亿人: 第 10 亿次的相对进口
在将其标记为重复之前,如果我想做的事情在 Python3 中是不可能的,那么我的问题是为什么它可以在 Python2 中工作,以及是什么促使决定在 Python3 中如此麻烦?
这是我的示例 Python 项目:
mypackage
- module1.py
- module2.py
- __init__.py
Run Code Online (Sandbox Code Playgroud)
__init__.py并且module2.py是空的
module1.py 包含:
import module2
# module1 contents
if __name__=="__main__":
# Some test cases for the contents of this module
pass
Run Code Online (Sandbox Code Playgroud)
这在 Python2 中工作正常。我可以从我计算机上任何位置的其他项目导入 module1,我也可以直接运行 module1 并if运行块中的代码。
但是,这种结构在 Python3 中不起作用。如果我尝试在其他地方导入模块,它会失败:
>>> from mypackage import module1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\_MyFiles\Programming\Python Modules\mypackage\module1.py", line …Run Code Online (Sandbox Code Playgroud) python relative-path python-import python-3.x python-packaging
我一直在阅读大量与此事相关的问题,但到目前为止没有一个对我有帮助。我目前正在使用 Pythonclick库将脚本作为命令执行。
我正在尝试执行的当前命令放置在具有__main__.py文件的 Python 包中,就像父目录一样。当前的项目结构如下。
/myproject
/foo_one
__init__.py
foo_one.py
/foo_two
__init__.py
foo_two.py
/foo_three
__init__.py
foo_three.py
/foo_four
__init__.py
foo_four.py
/foo_five
__init__.py
foo_five.py
/foo_six
__init__.py
foo_six.py
__init__.py
__main__.py
foo_seven.py
Run Code Online (Sandbox Code Playgroud)
每当我尝试运行__main__.py位于项目文件夹中的脚本时,都会出现以下错误。
ModuleNotFoundError: No module named '__main__.foo_two'; '__main__' is not a package
但是,如果我尝试使用这样的-m选项从上面的文件夹中执行相同的脚本python3 myproject -m,则会显示以下内容。
ImportError: attempted relative import with no known parent package
将__main__.py有2个进口这样的...的__init__.py是空的。
from .foo_two.foo_two import AClass, AnotherClass, OtherClass
from .foo_three.foo_three import AnotherClassMore
Run Code Online (Sandbox Code Playgroud)
更新:更正上一个命令中的语法错误,同时调用python -m myproject …