2009-06-16 4 views
10

actuel Pour mon application Python, je la structure des répertoires suivants:Comment importer un module à partir d'un répertoire au niveau au-dessus du script

\myapp 
\myapp\utils\ 
\myapp\utils\GChartWrapper\ 
\myapp\model\ 
\myapp\view\ 
\myapp\controller\ 

Une de ma classe dans \ myapp \ view \ doit importer une classe appelé GChartWrapper. Cependant, je reçois une erreur d'importation ...

myview.py 
from myapp.utils.GChartWrapper import * 

Voici l'erreur:

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart 
     args = ('No module named GChartWrapper.GChart',) 
     message = 'No module named GChartWrapper.GChart' 

Qu'est-ce que je fais mal? J'ai vraiment du mal à importer des modules/classes en Python ...

Répondre

7

Le __init__.py file du paquet GChartWrapper attend le paquet GChartWrapper sur PYTHONPATH. Vous pouvez dire par la première ligne:

from GChartWrapper.GChart import * 

Est-il nécessaire d'avoir le paquet GChartWrapper inclus dans la structure de votre répertoire de paquets? Si oui, alors une chose que vous pourriez faire est d'ajouter le chemin où le paquet réside à sys.path au moment de l'exécution. Je le prends myview.py dans le répertoire myapp\view? Ensuite, vous pouvez le faire avant d'importer GChartWrapper:

import sys 
import os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils'))) 

S'il est nécessaire d'avoir dans la structure de votre répertoire, il pourrait être plus facile d'avoir installé à l'emplacement conventionnel. Vous pouvez le faire en exécutant le script setup.py inclus dans la distribution source de GChartWrapper.

+0

J'essaie d'utiliser GChartWrapper sur App Engine, donc je ne peux pas vraiment lancer l'installation. Merci! :) – Martin

2

Vous pouvez changer le chemin où python cherche les fichiers.

En haut de votre fichier source, ajoutez:

import sys 
sys.path.append("..") 

Ou bien changer la variable d'environnement:

export PYTHONPATH=.. 
5

Vous n'importez pas les modules et paquets de chemins arbritary Au lieu de cela, vous en python utiliser des paquets et des importations absolues, ce qui évitera tous les problèmes futurs.

Exemple:

créer les fichiers suivants:

MyApp\myapp\__init__.py 
MyApp\myapp\utils\__init__.py 
MyApp\myapp\utils\charts.py 
MyApp\myapp\model\__init__.py 
MyApp\myapp\view\__init__.py 
MyApp\myapp\controller\__init__.py 
MyApp\run.py 
MyApp\setup.py 
MyApp\README 

Les fichiers doivent être vides à l'exception de ceux:

MyApp\myapp\utils\charts.py:

class GChartWrapper(object): 
    def __init__(self): 
     print "DEBUG: An instance of GChartWrapper is being created!" 

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper 

def start(): 
    c = GChartWrapper() # creating instance of the class 

MyApp\run.py:

from myapp.view import start 
start() 

C'est tout! Lorsque vous exécutez votre point d'entrée (run.py), il appelle une fonction sur la vue et crée une instance de la classe GChartWrapper. En utilisant cette structure, vous pouvez importer n'importe quoi n'importe où et l'utiliser.

En complément, dans MyApp\setup.py vous écrivez un programme d'installation pour le package MyApp \ myapp. Utilisez distutils pour l'écrire:

from distutils.core import setup 
setup(name='MyApp', 
     version='1.0', 
     description='My Beautiful Application', 
     author='Martin', 
     author_email='[email protected]', 
     url='http://stackoverflow.com/questions/1003843/', 
     packages=['myapp'], 
     scripts=['run.py'] 
    ) 

C'est suffisant. Maintenant, lorsque les utilisateurs téléchargent le dossier MyApp, ils peuvent simplement l'installer en utilisant setup.py et l'exécuter en utilisant run.py. Distutils peut générer des paquets dans un certain nombre de formats, y compris Windows installable .EXE

C'est la manière standard de distribuer des paquets/applications python.

0

GChartWrapper est également disponible à partir PyPI afin que vous puissiez utiliser easy_install ou pip pour installer le module:

sudo pip install GChartWrapper==0.9 

Il sera alors automatiquement ajouté à votre PYTHONPATH et vous pouvez le supprimer de votre/myapp/utils annuaire. Si vous ne pouvez pas utiliser sudo, regardez avec virtualenv (et virtualenvwrapper).

Questions connexes