我已经经历了许多Python相关的导入问题,但我无法理解这个问题/让它工作......
我的目录结构是:
Driver.py
A/
Account.py
__init__.py
B/
Test.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
====================
Driver.py
from B import Test
Run Code Online (Sandbox Code Playgroud)
=========
Account.py
class Account:
def __init__(self):
self.money = 0
Run Code Online (Sandbox Code Playgroud)
====================
Test.py
from ..A import Account
Run Code Online (Sandbox Code Playgroud)
==================
当我试图跑
python Driver.py
我收到了错误
Traceback(最近一次调用最后一次):
来自B进口测试
Driver.py从..A导入帐户输入"B/Test.py",第1行ValueError:尝试相对导入超出toplevel包
我正在玩Python的导入系统,以便更好地理解它是如何工作的,我遇到了另一个问题.我有以下结构
pkg/
__init__.py
c.py
d.py
subpkg/
__init__.py
a.py
b.py
Run Code Online (Sandbox Code Playgroud)
在里面a.py我有以下代码:
from . import b
from .. import d
Run Code Online (Sandbox Code Playgroud)
在里面c.py我有以下内容:
import subpkg.a
Run Code Online (Sandbox Code Playgroud)
现在我收到以下错误:
ValueError:尝试相对导入超出顶级包
但为什么呢?我该如何解决?我c.py从IDLE 运行,pkg应该被认为是一个包,因为它有__init__.py文件.
第一个导入工作正常,但它是以下不起作用:
from .. import d
Run Code Online (Sandbox Code Playgroud)
因为我试图从父包中导入一些东西,但显然我不能,因为一些奇怪的原因.
嘿所有 - 我用Python中的相对导入拉出我的头发.我已经阅读了30次文档和SO和其他论坛上的大量帖子 - 似乎仍然没有用.
我的目录结构目前看起来像这样
src/
__init__.py
main.py
components/
__init__.py
expander.py
language_id.py
utilities/
__init__.py
functions.py
Run Code Online (Sandbox Code Playgroud)
我希望expandder.py和language_id.py可以访问函数模块.我运行python main.py,它可以从components.expander import*和components.language_id import*访问模块.
但是,在expandder和language_id中的代码访问函数模块:
from ..utilities.functions import *
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError: Attempted relative import beyond toplevel package
Run Code Online (Sandbox Code Playgroud)
我已经过了很多次,它似乎遵循文档.任何人都对这里出了什么问题有任何想法?
所以,我的文件/文件夹结构如下:
\nproject/\n\xe2\x94\x9c\xe2\x94\x80 utils/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 module.py\n\xe2\x94\x9c\xe2\x94\x80 server/\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80 main.py\nRun Code Online (Sandbox Code Playgroud)\n在里面project/server/main.py我尝试project/utils/module.py使用以下语法导入:from ..utils.module import my_function。
我正在使用 VSCode,当我输入模块路径时,它甚至会自动完成。但是当我运行该文件时project/server/main.py,我在标题中收到错误。
我已经在堆栈溢出上阅读了有关此主题的数十个答案,但没有一个使用这样的示例。
\n从Python 2.7 的logginghowto(我的重点):
命名记录器时,一个好的习惯是在每个使用日志记录的模块中使用模块级记录器,命名如下:
logger = logging.getLogger(__name__)这意味着记录器名称跟踪包/模块的层次结构,并且从记录器名称中记录事件的地方就很明显了。
听起来像个好建议。
现在,本logging食谱提供了多个模块的示例,这些示例使用硬编码的记录器名称而不是__name__常量。在示例的“主模块”中,我们发现
logger = logging.getLogger('spam_application')
在“辅助模块”中
module_logger = logging.getLogger('spam_application.auxiliary')
我将此示例逐字复制到具有以下结构的package文件夹中:
cookbook-example
|- __init__.py
|- main_module.py
|- auxiliary_module.py
Run Code Online (Sandbox Code Playgroud)
这没有问题,可以从主模块和辅助模块产生预期的日志记录输出,但实际上是这样:
如果现在__name__按照logginghowto的建议,用常数替换硬编码的记录器名称,则菜谱示例将崩溃:我仅从主模块获取记录消息,而从辅助模块中获取不到任何消息。
我一定想念一些明显的东西。有什么想法我做错了吗?
注意:
有很多非常类似的问题和相关的答案,如:1,2,3,4,5,6,等等。但是,这些似乎都没有解决这个具体问题。
- 编辑 -
这是一个基于Cookbook示例的最小示例,显式名称字符串替换为__name__。
main_module.py
import logging
import auxiliary_module
# create and configure main logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# create console …Run Code Online (Sandbox Code Playgroud) 我知道有很多关于Python中相同导入问题的问题,但似乎没有人设法提供正确使用的明确示例.
比方说,我们有一个包mypackage有两个模块foo和bar.在里面,foo我们需要能够访问bar.
因为我们还在开发它,mypackage所以不在sys.path.
我们希望能够:
mypackage.foofoo.py作为脚本运行并从该__main__部分执行示例用法或测试.我们如何在foo.py中进行导入,以确保它在所有这些情况下都能正常工作.
# mypackage/__init__.py
...
# mypackage/foo/__init__.py
...
# mypackage/bar.py
def doBar()
print("doBar")
# mypackage/foo/foo.py
import bar # fails with module not found
import .bar #fails due to ValueError: Attempted relative import in non-package
def doFoo():
print(doBar())
if __name__ == '__main__':
doFoo()
Run Code Online (Sandbox Code Playgroud) 好的,这个场景非常简单.我有这个文件结构:
.
??? interface.py
??? pkg
? ??? __init__.py
? ??? mod1.py
? ??? mod2.py
Run Code Online (Sandbox Code Playgroud)
现在,这些是我的条件:
因此,在Python 2,我只想做import mod1内部mod2.py两者python2 mod2.py并python2 interface.py预期会工作.
但是,如果我这样做,这是我不太了解的部分,使用Python 3.5.2 import mod1; 然后我可以做python3 mod2.py,但python3 interface.py抛出:ImportError: No module named 'mod1':(
所以,显然,python 3建议import pkg.mod1用来避免与内置模块的冲突.好的,如果我使用我可以做的python3 interface.py; 但后来我不能python3 mod2.py因为:ImportError: No module named 'pkg'
同样,如果我使用相对导入:
from . import mod1然后python3 interface.py工作; 但mod2.py说SystemError: Parent module '' not loaded, …
有没有其他选择可以防止在python中导入模块时键入重复的长路径。
当前代码:
from a.b.c.d.e.f.g import g1
from a.b.c.d.e.f.g import g2
from a.b.c.d.e.f.g.h import h1
from a.b.c.d.e.f.g.i import i1
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码:
ref_path = a.b.c.d.e.f.g
from ref_path import g1
from ref_path import g2
from ref_path.h import h1
from ref_path.i import i1
Run Code Online (Sandbox Code Playgroud)
但是不幸的是它没有用。我不能这样做,a.b.c.d.e.f.g import *因为中可能有太多模块ref_path。
如果我能够做到这一点,我可以轻松地ref_paths从一个公共位置维护在不同模块中使用的不同公共资源。
可能重复:
如何在Python模块中正确使用相对或绝对导入?
我有这个文件布局,如下例所示:(在这里下载:http://www.mediafire.com/ ?oug42nzvxrvoms4) http://www.python.org/dev/peps/pep-0328/#guido- S-决定
moduleX包含:
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path
Run Code Online (Sandbox Code Playgroud)
这就是:
C:\package\subpackage1>python moduleX.py
Traceback (most recent call last):
File "moduleX.py", line 1, in <module>
from .moduleY import spam
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)
我有python 2.7.2.我有
__init__.py
Run Code Online (Sandbox Code Playgroud)
每个目录中的文件.为什么这段代码不起作用?
我已经阅读了无数有关python相对导入的讨论,我认为它如此混乱的原因之一是它将一个Python版本更改为另一个版本(我的版本是3.6)。但是这里的罪魁祸首似乎是PyCharm(除非我误会了..),我想知道是否有人遇到过此问题的解决方案。对于具有这种布局的项目:
/project
|-- __init__.py
|---subfolder
|-- __init__.py
|-- AA.py
|-- BB.py
Run Code Online (Sandbox Code Playgroud)
让我们想象一下,如果我编写此导入myfunc
文件,AA.py 在文件中包含一些功能BB.py:
from AA import myfunc
Run Code Online (Sandbox Code Playgroud)
那么Python的作品完美,但PyCharm认为这是一个错误:

因此,为了使PyCharm满意,我可以将y添加.到导入中,然后看似已解决了该错误:
from .AA import myfunc
Run Code Online (Sandbox Code Playgroud)
但后来python不高兴,给了我错误: ModuleNotFoundError: No module named '__main__.AA'; '__main__' is not a package
因此,总而言之,我使用的是实际有效的导入(即from AA import myfunc),但是如果我可以使PyCharm对此表示同意,那将是非常不错的,因为这样它就提供了诸如自动完成,定义等功能。
不是重复的: 我知道似乎这个主题已经被反复讨论了,但是它也有很多方面。在这里我谈论的是pycharm方面,因此据我所知这个主题是新的。