web-dev-qa-db-fra.com

ImportError avec from. importer x sur de simples fichiers python

Je voulais porter du code de python 2 à python 3 et il a échoué sur une erreur d'importation. J'ai donc essayé de me débarrasser du portage lui-même et de me concentrer sur l'importation en créant 2 fichiers de base python pour tester. Cependant, je ne peux même pas les faire fonctionner.

J'ai donc 2 fichiers

test.py:

print('Test works')

et test2.py:

from . import test

Le résultat est cependant cette erreur dans Pycharm:

ImportError: impossible d'importer le nom 'test' de '__main__' (C: /Users/Username/test2.py)

Dans Ubuntu Shell:

Traceback (dernier appel en date): fichier "test2.py", ligne 1, à partir de. import test1 SystemError: module parent '' non chargé, impossible d'effectuer une importation relative

Comment puis-je le résoudre?

6
JordyRitzen

Cette "structure de dossiers compte" est un gros problème en python3. La structure de votre dossier ne doit PAS avoir d'importance lors du codage, mais doit être référencée correctement.

Je viens de recourir à l'utilisation de if/else selon qu'il est exécuté localement ou dans le cadre d'un module:

if __name__ == "__main__": # Local Run
    import test
else: # Module Run, When going production - delete if/else
    from . import test
2
John Freeman

La structure des dossiers est importante. Vous n'avez pas nommé votre module; Je l'appellerai foo. Mettez les choses au bon endroit:

$ mkdir foo
$ touch foo/__init__.py
$ mv /some/place/{test1,test2}.py foo/

Notez que python -c 'import test' Fonctionne déjà, même avant d'écrire votre fichier test.py. Pour éviter toute confusion, je recommande de nommer votre fichier test1.py.

La façon dont vous appelez votre code est importante. Vérifiez que . Le point est dans sys.path:

$ export PYTHONPATH=.
$ python -m foo.test1

Sinon, cela devrait fonctionner, si vous préférez:

$ python foo/test1.py

ÉDITER:

J'ai répondu à la question n ° 1 et OP pose maintenant la question n ° 2 à propos de ce diagnostic:

ImportError: impossible d'importer le nom 'test' de 'main' (C: /Users/Username/test2.py)

Veuillez organiser vos fichiers dans la structure appropriée. Vous devez placer test2.py dans un répertoire foo/ (Ou comme vous voulez l'appeler). Vous devez créer un fichier foo/__init__.py Vide, car cela est important pour la machinerie import.

De plus, la variable env PYTHONPATH dans l'environnement d'appel est importante. En plus de l'environnement de ligne de commande, vous avez maintenant introduit un environnement PyCharm. Veillez à configurer correctement PyCharm pour votre projet. Cliquez sur Préférences -> Structure du projet et assurez-vous que foo s'affiche en tant que dossier source. Vous pouvez déboguer cela dans l'un ou l'autre environnement en exécutant ces lignes:

import sys
import pprint
pprint.pprint(sys.path)

Étant donné que import test Réussirait même sans que votre projet soit en place, je vous recommande de renommer test1.py Et d'utiliser import test1 Pour être sûr de tirer votre code .

1
J_H

En Python3

test2.py:

import test

test.py:

if __name__ == "__main__":
    print('Test works')

Si vous souhaitez imprimer "Test works" dans un autre fichier test2.py:

import test
test.main()

test.py:

def main():
    print('Test works')

if __name__ == "__main__":
    main()
1
Santhosh Kumar

J'ai eu le même problème et j'ai fini par supprimer le "de" ajouté au script de conversion 2to3.

0
Lee