[英]How to change a Python module name?
是否只能重命名文件? 或者文件中有一個__module__
變量來定義它的名字嗎?
如果你真的想用語句 'import newname' 導入文件 'oldname.py',有一個技巧可以使之成為可能:使用舊名稱將模塊導入某處,然后將其注入到具有新名稱的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
模塊。
您可以使用 as 更改導入時用於模塊的名稱:
import foo as bar
print bar.baz
是的,您應該重命名文件。 最好是在您完成此操作后從系統中刪除oldname.pyc
和oldname.pyo
編譯文件(如果存在),否則該模塊也可以以舊名稱導入。
當您import module_name
,Python 解釋器會在 PYTHONPATH 中查找文件module_name
.extension
。 因此,在不更改文件名稱的情況下不會更改該名稱。 但當然你可以這樣做:
import module_name as new_module_name
甚至
import module_name.submodule.subsubmodule as short_name
有用的例如。 用於編寫數據庫代碼。
import sqlite3 as sql
sql.whatever..
然后切換例如。 sqlite3
到pysqlite
您只需更改導入行
我在 bsddb 上遇到了這樣的問題。 我被迫安裝 bsddb3 模塊,但數百個腳本導入了 bsddb。 我沒有更改所有文件中的導入,而是提取了 bsddb3 蛋,並在 site-packages 目錄中創建了一個軟鏈接,以便“bsddb”和“bsddb3”與 python 相同。
每個類都有一個__module__
屬性,盡管我相信改變它不會改變類的命名空間。
如果可能的話,它可能涉及使用 setattr 將方法或類插入到所需的模塊中,盡管您冒着使您的代碼對未來的同行感到非常困惑的風險。
最好的辦法是重命名文件。
您希望將這個__module__
變量__module__
,以便您的原始腳本知道要導入什么? 模塊由文件名識別,並在sys.path
變量中定義的路徑中sys.path
。
因此,您必須重命名文件,然后刪除oldname.pyc
,以確保一切正常。
您可以通過模塊屬性設置模塊,如下所示。
func.__module__ = module
您甚至可以創建一個裝飾器來更改文件中特定函數的模塊名稱,例如:
def set_module(module):
"""Decorator for overriding __module__ on a function or class.
Example usage::
@set_module('numpy')
def example():
pass
assert example.__module__ == 'numpy'
"""
def decorator(func):
if module is not None:
func.__module__ = module
return func
return
然后使用
@set_module('my_module')
def some_func(...):
請注意,因為此裝飾器用於更改函數的單個模塊名稱。
此示例取自 numpy 源代碼: https : //github.com/numpy/numpy/blob/0721406ede8b983b8689d8b70556499fc2aea28a/numpy/core/numeric.py#L289
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.