[Python] Attempted relative import beyond toplevel package

Discussão em 'Python' iniciado por Stack, Junho 5, 2025.

  1. Stack

    Stack Membro Participativo

    Here is my folder structure:

    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


    In test_bash\__init__.py I have:

    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


    while in 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()


    Now when I issue:

    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


    I get:

    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


    Since 'Mopy" is in the sys.path and bosh\__init__.py is correctly resolved why it complains about relative import above the top level package ? Which is the top level package ?

    Incidentally this is my attempt to add tests to a legacy project - had asked in Python test package layout but was closed as a duplicate of Where do the Python unit tests go?. Comments on my current test package layout are much appreciated !


    Well the answer below does not work in my case:

    The module bash.py is the entry point to the application containing:

    if __name__ == '__main__':
    main()


    When I use import bash.bosh or from bash import bosh I get:

    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


    This usage message is from the main() in bash.

    This is different from the question linked as turns out the reason was partly a clash between modules and package names

    Continue reading...

Compartilhe esta Página