Подтвердить что ты не робот

Как я могу запретить сам модуль Python импортировать?

Например, я хочу создать плагин sql alchemy для другого проекта. И я хочу назвать этот модуль sqlalchemy.py. Проблема в том, что он не позволяет мне импортировать sqlalchemy:

#sqlalchemy.py
import sqlalchemy 

Это сделает сам модуль импортированным. Я пробовал это, но он не работает:

import sys
#Remove the current directory from the front of sys.path
if not sys.path[0]:
    sys.path.pop(0)
import sqlalchemy

Любые предложения?

4b9b3361

Ответ 1

Изменить: по мере того, как OP упомянул, что проблема является относительной, предпочтительной для абсолютного, самым простым решением для конкретной проблемы OP является добавление в начале модуля from __future__ import absolute_import который изменяет это предпочтение/порядок.

Следующее по-прежнему относится к щекотливой проблеме двух столкновений с абсолютным импортом (который, похоже, не является тем, что в настоящее время находится в OP):

После того, как вы импортировали модуль с именем x, этот модуль, записанный в sys.modules['x'] - изменение sys.path, как вы делаете, не изменит sys.modules. Вам также необходимо напрямую изменить sys.modules.

Например, рассмотрим:

$ cat a/foo.py
print __file__; import sys; sys.path.insert(0, "b"); del sys.modules["foo"]; import foo
$ cat b/foo.py
print __file__
$ python2.5 -c'import sys; sys.path.insert(0, "a"); import foo'
a/foo.py
b/foo.py

(запуск снова будет использовать и показывать файлы .pyc, а не .py, конечно).

Не самый чистый подход, и, конечно же, исходный модуль foo, неизбежно, недоступен извне (поскольку его запись sys.modules была смещена), но при необходимости вы могли бы использовать дополнительные хрупкие трюки ( stash sys.modules["foo"] где-то перед его удалением, после того, как вы импортируете другой foo, поместите этот модуль в другое место и восстановите оригинал sys.modules["foo"] - и т.д. и т.д.), в зависимости от ваших точных потребностей. (Конечно, избежать столкновений имен в первую очередь было бы почти всегда проще, чем вальсировать вокруг них таким образом; -).

Ответ 2

Не называйте его sqlalchemy.py?

Серьезно. Я думаю, что это проблема, которую должен решить абсолютный импорт. В python 2.5 это не должно происходить, но я ошибаюсь

Ответ 3

Вы можете просто сгореть от различий между запущенным кодом в интерактивном интерпретаторе и из файла. Удалите тест для sys.path[0], который пуст (при запуске из файла, это не так), и теперь импорт должен работать так, как вы хотите.

$ more sqlalchemy.py
import sys
print sys.path[0]
sys.path.pop(0)
import sqlalchemy
print sqlalchemy.__file__
$ python sqlalchemy.py 
/Users/nad
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/sqlalchemy/__init__.pyc
$ python
Python 2.6.4 (r264:75706, Oct 28 2009, 20:34:51) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys; print repr(sys.path[0])
''

EDIT: выше, если ваш основной модуль sqlalchemy.py. Если ваш модуль импортируется другим модулем, вам также придется изменить sys.modules, как объясняет Алекс.