Je souhaite importer une fonction à partir d'un autre fichier dans le même répertoire.

Parfois, cela fonctionne pour moi avec from .mymodule import myfunction mais parfois j'obtiens un:

SystemError: Parent module '' not loaded, cannot perform relative import

Parfois, cela fonctionne avec from mymodule import myfunction, mais parfois j'obtiens également un:

SystemError: Parent module '' not loaded, cannot perform relative import

Je ne comprends pas la logique ici, et je n'ai trouvé aucune explication. Cela semble complètement aléatoire.

Quelqu'un pourrait-il m'expliquer quelle est la logique derrière tout cela?

645
John Smith Optional 7 juin 2013 à 14:26

3 réponses

Mettez cela dans le fichier __init__.py de votre package :

# For relative imports to work in Python 3.6
import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__)))

En supposant que votre colis est comme ceci:

├── project
│   ├── package
│   │   ├── __init__.py
│   │   ├── module1.py
│   │   └── module2.py
│   └── setup.py

Utilisez maintenant des importations régulières dans votre package, comme:

# in module2.py
from module1 import class1

Cela fonctionne à la fois en python 2 et 3.

68
Brian Burns 16 mai 2018 à 12:38

J'ai rencontré ce problème. Une solution de contournement est importée via un bloc if / else comme suit:

#!/usr/bin/env python3
#myothermodule

if __name__ == '__main__':
    from mymodule import as_int
else:
    from .mymodule import as_int


# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()
32
Leon 13 janv. 2018 à 19:22

Si les deux packages se trouvent dans votre chemin d'importation (sys.path) et que le module / classe que vous voulez est dans example / example.py, alors pour accéder à la classe sans importation relative, essayez:

from example.example import fkt
1
Salt999 9 mars 2017 à 22:18