Импорт в Python - PullRequest
       41

Импорт в Python

3 голосов
/ 18 апреля 2009

Можно ли импортировать модули в зависимости от местоположения?

(например, все ли импортируемые модули должны быть в /usr/lib64/python2.5/ или аналогичном каталоге?)

Я бы хотел импортировать модуль, который является локальным для текущего скрипта.

Ответы [ 7 ]

9 голосов
/ 18 апреля 2009

Вы можете расширить путь во время выполнения следующим образом:

sys.path.extend(map(os.path.abspath, ['other1/', 'other2/', 'yourlib/']))
3 голосов
/ 18 апреля 2009
  • Python будет импортировать из текущего каталога по умолчанию.

  • sys.path - это переменная, которая контролирует, где Python ищет импорт.

3 голосов
/ 18 апреля 2009

Вы можете отредактировать PYTHONPATH , чтобы добавить или удалить местоположения, которые Python будет искать при каждой попытке импорта.

0 голосов
/ 18 апреля 2009

Использование init .py

Единственная проблема, возникающая при динамическом изменении sys.path, заключается в том, что вам нужно повторять его в каждом скрипте и жестко кодировать пути. Это становится грязным и не СУХИМ, если у вас есть даже два или три файла.

Вместо этого, если ваша файловая структура выглядит следующим образом:

~/foo/__init__.py
~/foo/foo.py
~/foo/bar/__init__.py
~/foo/bar/baz.py

Здесь init .py - это пустые файлы, созданные с помощью touch, тогда как foo.py и baz.py - это настоящие скрипты на python. Тогда вы можете сделать что-то вроде этого:

import sys
try:
    from foo import foo
    from foo.bar import baz
except ImportError:
    "%s is not in %s. Add to your PYTHONPATH in ~/.bashrc" % \
    (os.path.expanduser("~/foo"),sys.path)

Структурирование ваших вещей как пакета с самого начала - это небольшая дополнительная работа, но значительно упрощает масштабирование проекта позже и возможность видеть, откуда идет импорт. Более того, если вы перемещаете вещи вокруг, вы можете использовать одну символическую ссылку, а не выполнять поиск / замену через свою кодовую базу. Например. если вы переместили '~ / foo' в '~ / downloads / foo', просто сделайте это:

cd ~
ln -s ~/downloads/foo foo

И весь ваш импорт все равно будет работать.

0 голосов
/ 18 апреля 2009

Для низкоуровневого контроля над процессом импорта модуль imp позволяет импортировать модули из произвольно открытых файлов под произвольными именами.

Например, если это foo.py:

def x():
    print 'hello, world'

Тогда этот код:

import imp

with open('foo.py', 'r') as module_file:
    imp.load_module('module_name', module_file, '', ('', 'r', imp.PY_SOURCE))

import module_name

module_name.x()

печатает "привет, мир".

0 голосов
/ 18 апреля 2009

Поиск в ./lib по умолчанию.

0 голосов
/ 18 апреля 2009

Вы можете импортировать модуль, который находится по тому же пути, что и модуль, в который вы импортируете. Например:

В каталоге: mod1.py, mod2.py

mod2.py
--------
import mod1

Или вы можете добавить любой каталог к ​​вашей переменной PYTHON_PATH:

import sys
sys.path.extend('/user/some/other/directory')
import mod1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...