Tentative d'importation relative au-delà du package toplevel
Voici ma structure de dossier:
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
Dans test_bash\__init__.py
j'ai:
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
tandis que dans 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()
Maintenant, quand je question:
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
J'obtiens:
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
Depuis Mopy" est dans le sys.chemin d'accès et bosh\__init__.py
est correctement résolu pourquoi il se plaint par rapport à l'importation au-dessus du niveau supérieur du paquet ? Qui est le haut niveau, ?
D'ailleurs c'est ma tentative pour ajouter des tests pour un projet de l'héritage - avait demandé à Python package de test de mise en pagemais a été fermé comme un double de Où faire du Python tests unitaires aller?. Commentaires sur mon paquet de test de mise en page sont très appréciés !
Bien le réponse ci-dessous ne fonctionne pas dans mon cas:
La module bash.py est le point d'entrée de l'application contenant:
if __name__ == '__main__':
main()
Lorsque j'utilise import bash.bosh
ou from Bash import bosh
j'obtiens:
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
Ce message est à partir de la méthode main() dans bash.
source d'informationauteur Mr_and_Mrs_D
Vous devez vous connecter pour publier un commentaire.
TLDR: Ne
ou
Si vous aussi vous venez d'arriver à avoir une construction comme
bash.bash
vous devez vous assurer que votre paquet prend le pas sur le contenu. Au lieu de l'ajout, l'ajouter à la face de l'ordre de recherche:Lorsque vous ne
il va importer le module
bosh
. Cela signifieMopy/bash
est dans votresys.path
python trouve le fichierbosh
là, et les importations. Le module est maintenant mondialement connu par le nombosh
. Sibosh
est lui-même un module ou le colis n'a pas d'importance pour ce faire, il modifie uniquement sibosh.py
oubosh/__init__.py
est utilisé.Maintenant, quand
bosh
essaie de fairec'est pas une opération du système de fichiers ("un répertoire, fichier bass"), mais un nom de module de l'opération. Il signifie "un paquet niveau du module de basses".
bosh
n'était pas importé de son emballage, mais sur son propre, si. Donc monter d'un paquet n'est pas possible vous vous retrouverez dans le package''
ce qui n'est pas valide.Regardons ce qui se passe lorsque vous ne
à la place. Tout d'abord, le paquet
bash
est importé. Ensuite,bosh
est importé en tant que module de l'ensemble - il est globalement sais quebash.bosh
même si vous avez utiliséfrom bash import bosh
.Quand
bosh
neque l'on travaille maintenant: aller d'un niveau de
bash.bosh
vous obtient àbash
. À partir de là,bass
est importé en tant quebash.bass
.Voir aussi cette réponse pour l'exécution d'un module à partir de l'intérieur d'un emballage, sans modification de
sys.path
.