2015-11-30 1 views
0

Je développe un projet avec Python 3 et je voudrais l'emballer comme un module Python pour qu'il puisse être installé en tant que bibliothèque sur nos machines. Cependant, je suis un problème avec l'importation du module après l'installation alors laissez-moi vous montrer le codeImpossible de charger des classes à partir du module installé

├── README.txt 
├── setup.py 
├── virt_template 
│   ├── debian 
│   │   └── interfaces 
│   ├── debian_platform.py 
│   ├── __init__.py 
│   ├── virt_template.py 
│   └── test 
│    ├── __init__.py 
│    └── virt_template_test.py 

Ceci est le contenu setup.py

from setuptools import setup, find_packages 

setup(
    name = "virt_template", 
    packages = find_packages(), 
    package_data = {"virt_template" : ["debian/*"]}, 
    version = "1.0.0", 
    author = "Petr Mensik", 
    author_email = "[email protected]", 
    classifiers = [ 
     "Programming Language :: Python", 
     "Programming Language :: Python :: 3", 
     "Intended Audience :: Developers", 
     "Operating System :: Linux", 
     "Topic :: Software Development :: Libraries :: Python Modules", 
    ] 
) 

Maintenant, quand je lance python3 setup.py install le module est correctement installé dans /usr/local/lib/python3.4/dist-packages/virt_template-1.0.0-py3.4.egg/virt_template avec la structure de dossier comme ceci

├── debian 
│   └── interfaces 
├── debian_platform.py 
├── __init__.py 
├── virt_template.py 
└── test 
    ├── __init__.py 
    └── virt_template_test.py 

Jusqu'ici tout va bien, cela me semble correct. Cependant quand je le fais

from virt_template import VirtualMachine 

Je reçois cannot import name VirtualMachine. J'ai donc essayé

from virt_template.virt_template import VirtualMachine 

et le résultat est No module named 'debian_platform' - qui fait probablement référence au fichier debian_platform.py.

Alors qu'est-ce que je fais mal?

Répondre

1

En vous cas l'importation correcte est

from virt_template.virt_template import VirtualMachine 

Votre problème est la façon dont vous importez des modules relatifs de virt_template.py. Vous devez soit faire

from . import debian_platform 

ou

from virt_template import debian_platform 

La cause racine de votre problème est le PYTHONPATH qui est fixé à l'intérieur du répertoire virt_template lorsque vous testez le code, et à une bibliothèque site_packages dir lorsque utilisé après l'installation avec setuptools

+0

Merci pour votre réponse. Alors, que dois-je changer à propos de la structure du répertoire pour importer mon module comme 'import virt_template' –

+0

Vous ne devriez pas changer la structure. Utilisez l'une des importations ci-dessus, soit le nom complet avec le nom du paquet devant ou relatif avec le point. Vous voudrez peut-être en savoir plus sur [importations relatives] (https://docs.python.org/2.5/whatsnew/pep-328.html). C'est la vie d'un développeur de paquets. Dans votre cas, vous avez choisi le nom du paquet comme le nom de votre module, ce qui rend votre importation plus mauvaise. Vous pouvez importer votre classe dans le plus haut __init__.py. Ensuite, il sera disponible au niveau du paquet. –

+0

Ok, je l'ai résolu en collant le contenu de 'virt_template' directement dans le dossier avec le script' setup.py', merci de votre aide –