Как изменить имя модуля Python? - PullRequest
6 голосов
/ 26 февраля 2009

Возможно ли это только если я переименую файл? Или в файле есть переменная __module__ для определения его имени?

Ответы [ 7 ]

22 голосов
/ 26 февраля 2009

Если вы действительно хотите импортировать файл 'oldname.py' с оператором 'import newname', есть хитрость, которая делает это возможным: импортируйте модуль куда-нибудь со старым именем, а затем введите это в sys.modules с новым именем. Последующие операторы импорта также найдут его под новым именем. Пример кода:

# this is in file 'oldname.py'
...module code...

Использование:

# inject the 'oldname' module with a new name
import oldname
import sys
sys.modules['newname'] = oldname

Теперь вы можете везде свой модуль с import newname.

13 голосов
/ 26 февраля 2009

Вы можете изменить имя, используемое для модуля при импорте, используя:

import foo as bar
print bar.baz
9 голосов
/ 26 февраля 2009

Да, вы должны переименовать файл. Лучше всего после того, как вы это сделаете, чтобы удалить скомпилированные файлы oldname.pyc и oldname.pyo (если они есть) из вашей системы, в противном случае модуль будет импортирован и под старым именем.

1 голос
/ 26 февраля 2009

Когда вы делаете import module_name, интерпретатор Python ищет файл module_name.extension в PYTHONPATH. Так что нет никакого изменения этого имени без изменения имени файла. Но, конечно, вы можете сделать:

import module_name as new_module_name

или даже

import module_name.submodule.subsubmodule as short_name

Полезно, например. для написания кода БД.

import sqlite3 as sql
sql.whatever..

А затем переключиться, например. sqlite3 на pysqlite вы просто измените строку импорта

0 голосов
/ 20 ноября 2013

У меня была такая проблема с bsddb. Я был вынужден установить модуль bsddb3, но сотни скриптов импортировали bsddb. Вместо того, чтобы изменять импорт во всех них, я извлек яйцо bsddb3 и создал мягкую ссылку в каталоге site-packages, чтобы и «bsddb», и «bsddb3» были одинаковыми для python.

0 голосов
/ 26 февраля 2009

Где бы вы хотели иметь эту переменную __module__, чтобы ваш оригинальный скрипт знал, что импортировать? Модули распознаются по именам файлов и просматриваются по путям, определенным в переменной sys.path.

Итак, вы должны переименовать файл, затем удалить oldname.pyc, просто чтобы убедиться, что все работает правильно.

0 голосов
/ 26 февраля 2009

У каждого класса есть свойство __module__, хотя я считаю, что его изменение не изменит пространство имен класса.

Если это возможно, возможно, потребуется использовать setattr для вставки методов или класса в нужный модуль, хотя вы рискуете сделать свой код очень запутанным для ваших будущих коллег.

Лучше всего переименовать файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...