[英]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.