繁体   English   中英

如何更改 Python 模块名称?

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

然后切换例如。 sqlite3pysqlite您只需更改导入行

我在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM