如何更改Python模块名称?

时间:2009-02-26 12:01:23

标签: python module

只有重命名文件才可以吗?或者文件中是否有__module__变量来定义它的名称?

8 个答案:

答案 0 :(得分:22)

如果你真的想要使用“import newname”语句导入文件'oldname.py',可以使用一个技巧:使用旧名称导入模块某处,然后使用新名称将其注入sys.modules。后续的import语句也会在新名称下找到它。代码示例:

# 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

答案 1 :(得分:13)

您可以使用as:

更改导入时用于模块的名称
import foo as bar
print bar.baz

答案 2 :(得分:9)

是的,您应该重命名该文件。最好的做法是从您的系统中删除oldname.pycoldname.pyo已编译文件(如果存在),否则模块也可以旧名称导入。

答案 3 :(得分:1)

执行import module_name时,Python解释程序会在PYTHONPATH中查找文件module_name .extension 。因此,如果不更改文件名,就不会出现这种名称。但当然可以这样做:

import module_name as new_module_name

甚至

import module_name.submodule.subsubmodule as short_name

有用的例如。用于编写DB代码。

import sqlite3 as sql
sql.whatever..

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

答案 4 :(得分:0)

每个类都有__module__属性,但我相信更改它不会改变类的命名空间。

如果可能的话,可能会涉及使用setattr将方法或类插入到所需的模块中,尽管你冒着让你的代码对你未来的同行感到困惑的风险。

您最好的办法是重命名文件。

答案 5 :(得分:0)

您希望在哪里获得此__module__变量,以便原始脚本知道要导入的内容?模块由文件名识别,并在sys.path变量中定义的路径中查找。

因此,您必须重命名该文件,然后删除oldname.pyc,以确保一切正常。

答案 6 :(得分:0)

我有一个像bsddb这样的问题。我被迫安装了bsddb3模块,但数百个脚本导入了bsddb。我没有更改所有这些中的导入,而是提取了bsddb3 egg,并在site-packages目录中创建了一个软链接,这样“bsddb”和“bsddb3”都与python相同。

答案 7 :(得分:0)

您可以通过如下所示的 module 属性设置模块。

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