只有重命名文件才可以吗?或者文件中是否有__module__
变量来定义它的名称?
答案 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.pyc
和oldname.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..
然后切换例如。 sqlite3
到pysqlite
您只需更改导入行
答案 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