相关疑难解决方法(0)

来自兄弟文件夹的Python导入模块

我已经经历了许多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 import module relative-path

35
推荐指数
2
解决办法
2万
查看次数

ValueError:尝试相对导入超出顶级包

我正在玩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-import python-3.x

33
推荐指数
2
解决办法
3万
查看次数

Python中的相对导入

嘿所有 - 我用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)

我已经过了很多次,它似乎遵循文档.任何人都对这里出了什么问题有任何想法?

python python-packaging

28
推荐指数
1
解决办法
2万
查看次数

Python 错误 - ImportError:尝试在没有已知父包的情况下进行相对导入

所以,我的文件/文件夹结构如下:

\n
project/\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\n
Run Code Online (Sandbox Code Playgroud)\n

在里面project/server/main.py我尝试project/utils/module.py使用以下语法导入:from ..utils.module import my_function

\n

我正在使用 VSCode,当我输入模块路径时,它甚至会自动完成。但是当我运行该文件时project/server/main.py,我在标题中收到错误。

\n

我已经在堆栈溢出上阅读了有关此主题的数十个答案,但没有一个使用这样的示例。

\n

python relative-import

21
推荐指数
1
解决办法
5万
查看次数

如何在多个模块中使用logging.getLogger(__ name__)

从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的建议,用常数替换硬编码的记录器名称,则菜谱示例将崩溃:我仅从主模块获取记录消息,而从辅助模块中获取不到任何消息。

我一定想念一些明显的东西。有什么想法我做错了吗?

注意:

有很多非常类似的问题和相关的答案,如:123456,等等。但是,这些似乎都没有解决这个具体问题。

- 编辑 -

这是一个基于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 logging

17
推荐指数
2
解决办法
1万
查看次数

相对python导入的最终答案

我知道有很多关于Python中相同导入问题的问题,但似乎没有人设法提供正确使用的明确示例.

比方说,我们有一个包mypackage有两个模块foobar.在里面,foo我们需要能够访问bar.

因为我们还在开发它,mypackage所以不在sys.path.

我们希望能够:

  • 进口 mypackage.foo
  • foo.py作为脚本运行并从该__main__部分执行示例用法或测试.
  • 使用Python 2.5

我们如何在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)

python import relative-path python-2.5

16
推荐指数
2
解决办法
8680
查看次数

在Python 3中从同一个包和包外部导入模块

好的,这个场景非常简单.我有这个文件结构:

.
??? interface.py
??? pkg
?   ??? __init__.py
?   ??? mod1.py
?   ??? mod2.py
Run Code Online (Sandbox Code Playgroud)

现在,这些是我的条件:

  • mod2需要导入mod1.
  • interface.py和mod2都需要作为主脚本独立运行.如果您愿意,可以将接口视为实际程序,将mod2视为软件包的内部测试程序.

因此,在Python 2,我只想做import mod1内部mod2.py两者python2 mod2.pypython2 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, …

import package python-3.x

14
推荐指数
1
解决办法
2861
查看次数

python中重复的导入路径模式

有没有其他选择可以防止在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 python-3.x

14
推荐指数
2
解决办法
259
查看次数

python相对导入示例代码不起作用

可能重复:
如何在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 import

12
推荐指数
1
解决办法
2万
查看次数

pycharm 2018中的相对导入无法像python 3.6中的相对导入一样工作

我已经阅读了无数有关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方面,因此据我所知这个主题是新的。

  1. PyCharm如何处理模块的相对导入?-是未将根项目目录添加到PYTHONPATH的用户
  2. Pycharm自动相对导入 -在谈论自动导入功能,这里不是这种情况
  3. PyCharm中的子包和相对导入 -在谈论python 2.7中的导入问题,但是在这里我没有任何导入问题
  4. 相对进口量为10亿次 -很好地回顾了进口问题,并提供了非常详细的答案-对于我而言,这没有帮助,因为我没有任何进口问题。更不用说这是python 2.7主题,而不是3.x

pycharm

12
推荐指数
1
解决办法
2685
查看次数