当前位置: 首页 > 面试题库 >

尝试了相对于顶级包的相对导入

孔阳炎
2023-03-14
问题内容

这是我的文件夹结构:

Mopy/ # no init.py !
   bash/
     __init__.py
     bash.py # <--- Edit: yep there is such a module too
     bass.py
     bosh/
       __init__.py # contains from .. import bass
       bsa_files.py
     ...
   test_bash\
     __init__.py # code below
     test_bosh\
       __init__.py
       test_bsa_files.py

test_bash\__init__.py我有:

import sys
from os.path import dirname, abspath, join, sep
mopy = dirname(dirname(abspath(__file__)))
assert mopy.split(sep)[-1].lower() == 'mopy'
sys.path.append(mopy)
print 'Mopy folder appended to path: ', mopy

在时test_bsa_files.py

import unittest
from unittest import TestCase

import bosh

class TestBSAHeader(TestCase):
    def test_read_header(self):
        bosh.bsa_files.Header.read_header()

if __name__ == '__main__':
    unittest.main()

现在,当我发出:

python.exe "C:\_\JetBrains\PyCharm 2016.2.2\helpers\pycharm\utrunner.py" C:\path\to\Mopy\test_bash\test_bosh\test_bsa_files.py true

我得到:

Traceback (most recent call last):
  File "C:\_\JetBrains\PyCharm 2016.2.2\helpers\pycharm\utrunner.py", line 124, in <module>
    modules = [loadSource(a[0])]
  File "C:\_\JetBrains\PyCharm 2016.2.2\helpers\pycharm\utrunner.py", line 43, in loadSource
    module = imp.load_source(moduleName, fileName)
  File "C:\Dropbox\eclipse_workspaces\python\wrye-bash\Mopy\test_bash\test_bosh\test_bsa_files.py", line 4, in <module>
    import bosh
  File "C:\Dropbox\eclipse_workspaces\python\wrye-bash\Mopy\bash\bosh\__init__.py", line 50, in <module>
    from .. import bass
ValueError: Attempted relative import beyond toplevel package

由于“多份原件打印”是在sys.path中,并bosh\__init__.py正确地解决它为什么抱怨相对进口上述顶层包? 这是顶层包

顺便说一句,这是我向旧项目中添加测试的尝试-在Python测试包布局中曾提出过要求,但作为Python单元测试去哪儿的副本被关闭了。对我当前的测试包布局的评论深表感谢!

那么下面的答案不适用于我的情况:

模块 bash.py是入口点到包含应用:

if __name__ == '__main__':
    main()

当我使用import bash.boshfrom bash import bosh得到:

C:\_\Python27\python.exe "C:\_\JetBrains\PyCharm 2016.2.2\helpers\pycharm\utrunner.py" C:\Dropbox\eclipse_workspaces\python\wrye-bash\Mopy\test_bash\test_bosh\test_bsa_files.py true
Testing started at 3:45 PM ...
usage: utrunner.py [-h] [-o OBLIVIONPATH] [-p PERSONALPATH] [-u USERPATH]
                   [-l LOCALAPPDATAPATH] [-b] [-r] [-f FILENAME] [-q] [-i]
                   [-I] [-g GAMENAME] [-d] [-C] [-P] [--no-uac] [--uac]
                   [--bashmon] [-L LANGUAGE]
utrunner.py: error: unrecognized arguments: C:\Dropbox\eclipse_workspaces\python\wrye-bash\Mopy\test_bash\test_bosh\test_bsa_files.py true

Process finished with exit code 2

此用法消息来自bash中的main()。


问题答案:

TLDR:做

import bash.bosh

要么

from bash import bosh

避免修改sys.path,因为这会重复模块。

当你做

import bosh

它将导入 模块
bosh。这意味着pythonMopy/bash在您的中sys.path找到该文件bosh,并将其导入。现在,该模块的名称已在全球范围内广为人知bosh。无论bosh是本身就是一个模块或包不要紧此,它只会改变是否bosh.pybosh/__init__.py使用。

现在,当bosh尝试做

from .. import bass

不是
文件系统操作(“一个目录向上,文件低音”),而是模块名称操作。这意味着“一个包升级,模块低音”。bosh不是从其程序包中导入的,而是独立的。因此,上一个包是不可能的-
您最终遇到该包'',这是无效的。

让我们看看你做的时候会发生什么

import bash.bosh

代替。首先, bash被导入。然后,bosh被导入 为该软件包 的模块-bash.bosh即使您使用,它也被全局称为from bash import bosh

什么bosh时候

from .. import bass

一个作品现在:去一个级别从bash.bosh得到你bash。从那里bass导入为bash.bass



 类似资料:
  • 问题内容: 我的项目存在以下问题,请帮帮我!这是我的包裹的结构: 这是foo1.py的实现: 当我运行foo1时,出现错误: ValueError:尝试了相对于顶级包的相对导入 。 我可以通过以下调整来解决它: 但是我想知道是否有一种方法可以不导入sys并在其中附加父目录。 我听说,例如,如果我有.py文件’/pkg/start.py’,它调用了我的foo1模块,那么两个点就可以了。但是,有什么方

  • 如何在Python中从低级目录导入类? 我一直在阅读如何将添加到文件夹中(或者这只是在Python2中吗?)或者如何使用,但是这些都不起作用。 通过下面的代码,我得到了:valueerror:尝试相对导入超出顶级包 文件2.py 谢谢你。

  • 我是一个新手。我刚刚开始写一个django项目。它被称为iRayProject,由两个应用程序iRay_user_authentication和iRay_working_with_notes组成:这里的项目结构 iRay_user_authentication - 这是一个用于注册的标准django应用程序 这是他的urls.py 在 views.py 注册用户使用重定向我想发送到项目的第二个应用

  • 这是我的文件结构: MainDir/ |Foo.py |SubDir/ || ||Bar.py 富。py: 酒吧py: 通过这段代码,我试图从Foo中获取var的值,并将其保存在Bar中 我在运行Foo时遇到此错误。py(和Bar.py):ImportError尝试在顶级包之外进行相对导入 我知道有很多这样的问题,但是我没有通过查看所有的问题来解决它。我被困在这个问题上大约一周了。提前谢谢!

  • 问题内容: 似乎这里已经有很多关于python 3中相对导入的问题,但是经过许多讨论之后,我仍然找不到我问题的答案。所以这是问题。 我有一个如下所示的包裹 我在中只有一行: 现在,我在的文件夹中package,然后运行 我收到消息 但是如果我在的父文件夹中package,则运行: 一切都好。 现在我的问题是: 当我位于的文件夹中时,根据我的理解,我在test_A子软件包中运行模块,原因是,该模块.

  • 为了更好地理解Python的导入系统是如何工作的,我在玩Python的导入系统时遇到了另一个问题。我有以下结构 在中有以下代码: 在中有以下内容: 但为什么?我该怎么解决呢?我正在从空闲中运行,应该被认为是一个包,因为它有文件。 第一个导入很好,但以下内容不起作用: 因为我试图从父包导入一些东西,但显然我不能,因为一些奇怪的原因。