Importuj moduł Pythona nie na ścieżce

Mam moduł foo, zawierający util.py oraz bar.py.

Chcę zaimportować go w bezczynności lub w sesji Pythona. Jak mam to zrobić?

Nie znalazłem dokumentacji jak importować Moduły Nie znajdujące się w bieżącym katalogu ani domyślnej ścieżce Pythona. Po próbie import "<full path>/foo/util.py", i from "<full path>" import util

Najbliżej było

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

Co dało mi odmowę pozwolenia na windows 7.

Author: Garrett, 2012-04-15

4 answers

Jednym ze sposobów jest po prostu zmiana ścieżki :

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

Zauważ, że wymaga to, aby foo był pakietem Pythona, tzn. zawierał plik __init__.py. Jeśli nie chcesz modyfikować sys.path, możesz zmodyfikować również zmienną środowiskową PYTHONPATH lub zainstalować moduł w swoim systemie. Uważaj, że oznacza to, że inne katalogi lub pliki .py w tym katalogu mogą być ładowane nieumyślnie.

Dlatego możesz użyć imp.load_source zamiast tego. Potrzebuje nazwy pliku, nie jest katalogiem (do pliku, który bieżący użytkownik może odczytać):

import imp
util = imp.load_source('util', 'C:/full/path/foo/util.py')
 65
Author: phihag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 20:39:13

Możesz dostosować ścieżkę wyszukiwania modułu za pomocą zmiennej środowiskowej PYTHONPATH lub ręcznie zmodyfikować listę katalogów sys.path.

Patrz ścieżka wyszukiwania modułu dokumentacja na python.org.

 5
Author: icecrime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 11:26:29

Spróbuj

import sys
sys.path.append('c:/.../dir/dir2')
import foo
 2
Author: Levon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 11:29:09

Podążając za wskazówką phihaga, mam takie rozwiązanie. Po prostu podaj ścieżkę do pliku źródłowego load_src i załaduje go. Musisz również podać nazwę, aby można było zaimportować ten moduł używając 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()

Inny (mniej wyraźny) sposób jest taki:

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

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

Edit: metoda została przepisana, aby była jaśniejsza.

 1
Author: Jabba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-01 16:52:56