web-dev-qa-db-fra.com

Importer python module PAS sur le chemin

J'ai un module foo, contenant util.py et bar.py.

Je veux l'importer dans IDLE ou python session. Comment procéder?

Je n'ai trouvé aucune documentation sur la manière d'importer des modules qui ne se trouvent pas dans le répertoire actuel ni dans le répertoire par défaut python CHEMIN. Après avoir essayé import "<full path>/foo/util.py", et from "<full path>" import util

Le plus proche que je pouvais obtenir était

import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')

Ce qui m'a donné la permission refusée sur Windows 7.

48
Vort3x

Une solution consiste à modifier simplement votre chemin :

import sys
sys.path.append('C:/full/path')
from foo import util,bar

Notez que cela nécessite que foo soit un package python, c’est-à-dire contient un __init__.py fichier. Si vous ne voulez pas modifier sys.path, vous pouvez modifier également la variable d’environnement PYTHONPATH ou installer le module sur votre système . Attention, cela signifie que d’autres répertoires ou .py Les fichiers de ce répertoire peuvent être chargés par inadvertance.

Par conséquent, vous pouvez utiliser imp.load_source à la place. Il faut le nom de fichier, pas un répertoire (dans un fichier que l'utilisateur actuel est autorisé à lire):

import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')
66
phihag

Vous pouvez personnaliser le chemin de recherche du module à l’aide de la variable d’environnement PYTHONPATH ou modifier manuellement le fichier sys.path liste de répertoires.

Voir Chemin de recherche du module documentation sur python.org.

5
icecrime

Essayez ceci

import sys
sys.path.append('c:/.../dir/dir2')
import foo
2
Levon

Après le conseil de phihag, j'ai cette solution. Il suffit de donner le chemin d’un fichier source à load_src et il le chargera. Vous devez également fournir un nom pour pouvoir importer ce module en utilisant ce nom. Je préfère le faire de cette façon parce que c'est plus explicite:

def load_src(name, fpath):
    import os, imp
    return imp.load_source(name, os.path.join(os.path.dirname(__file__), fpath))

load_src("util", "../util.py")
import util

print util.method()

Une autre manière (moins explicite) est la suivante:

util = load_src("util", "../util.py")    # "import util" is implied here

print util.method()    # works, util was imported by the previous line

Edit: la méthode est réécrite pour la rendre plus claire.

1
Jabba