2012-04-15 22 views
44

Mam moduł foo, zawierający util.py i bar.py.Importuj moduł Pythona NIE na ścieżce

Chcę zaimportować go w IDLE lub sesji Pythona. Jak mam to zrobić?

Nie mogłem znaleźć żadnej dokumentacji dotyczącej importowania modułów spoza bieżącego katalogu lub domyślnej ścieżki PATH. Po wypróbowaniu import "<full path>/foo/util.py", i from "<full path>" import util

Najbliżej mogę dostać było

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

co dało mi uprawnien na windows 7.

+0

Warto również sprawdzić to [powiązane pytanie] (http://stackoverflow.com/questions/15109548/set-pythonpath-before-import-statements). W szczególności podoba mi się tam [najlepsza odpowiedź] (http://stackoverflow.com/a/15109660/95852), ze względu na jasność co do bezpieczeństwa zmian w 'sys.path'. –

+0

Możliwy duplikat [Jak zaimportować moduł z pełną ścieżką?] (Http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path) –

Odpowiedz

62

Jednym ze sposobów jest po prostu zmienić swój path:

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

Zauważ, że wymaga to foo być pakiet python, to znaczy zawierać plik __init__.py. Jeśli nie chcesz modyfikować sys.path, możesz also modify the PYTHONPATH environment variable lub install the module on your system. Pamiętaj, że oznacza to, że inne katalogi lub pliki z tego katalogu mogą zostać załadowane przypadkowo.

Dlatego możesz zamiast tego użyć imp.load_source. Trzeba nazwę pliku, a nie katalogu (do pliku, który obecny użytkownik ma prawo do odczytu):

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

Działa, ale teraz, gdy próbuje użyć util.method za pomocą metody, mówi "metoda" nie zdefiniowane. Ale mogę go użyć przez util.method. Czemu? – Vort3x

+2

Ponieważ nie zdefiniowałeś "metody", tylko "metoda" w 'util'. Możesz zdefiniować 'method = util.method', jeśli chcesz. – katrielalex

+0

Zauważ, że 'from foo import *' to złe kodowanie, chyba że hakujesz w powłoce. – katrielalex

5

Można dostosować ścieżkę przeszukiwania moduł za pomocą zmiennej środowiskowej PYTHONPATH lub ręcznie zmodyfikuj listę katalogów sys.path.

Zobacz dokumentację nana stronie python.org.

2

spróbuj tego

import sys 
sys.path.append('c:/.../dir/dir2') 
import foo 
+1

-1 Ponieważ dołączanie do ścieżki Pythona jest złym rozwiązaniem. Działa, ale jest znacznie gorsza niż imp.load_source, ponieważ użytkownik może nie chcieć modyfikować żadnych ścieżek systemowych lub może pracować na komputerze, na którym nie może tego zrobić. Jest to jedna z najbardziej irytujących "funkcji" w Pythonie, która w przeciwnym razie jest eleganckim językiem. To głupie, że nie można po prostu nadać importowi ciągu nazwującego ścieżkę do innego pliku .py.A ponieważ nie możesz, ochrona przed zmianami ścieżek systemowych za pomocą imp jest ściśle lepsza. – ely

+1

@EMS Ah .. Widzę, co mówisz, nie zdawałem sobie z tego sprawy wcześniej, ale teraz twój punkt widzenia jest jasny. Dzięki za wskazanie tego. (Być może będę musiał zmodyfikować mój własny kod teraz :) – Levon

+3

Nie martw się. Jest to zamierzony cel 'sys.path' (lub przynajmniej * an * zamierzony przypadek użycia). Pan F (który najwidoczniej był wcześniej EMS) jest w błędzie. Jak zauważa phihag w swojej odpowiedzi na identyczny komentarz -1 swojej odpowiedzi, 'sys.path' jest * nie * związane z ogólną ścieżką systemową. –

1

Following końcówki phihag jest, mam to rozwiązanie. Po prostu podaj ścieżkę pliku źródłowego do load_src i zostanie ona załadowana. Musisz również podać nazwę, aby móc importować ten moduł przy użyciu tej nazwy. Wolę to zrobić w ten sposób, ponieważ jest to bardziej wyraźne:

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() 

Innym (mniej wyraźny) droga jest taka:

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

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

Edit: metoda jest przepisany do uczynienia go bardziej zrozumiałym.

Powiązane problemy