Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改Python模块名称?_Python_Module - Fatal编程技术网

如何更改Python模块名称?

如何更改Python模块名称?,python,module,Python,Module,是否只有重命名该文件才有可能?或者文件中是否有一个\uuu模块\uuu变量来定义其名称?是的,您应该重命名文件。最好是在完成此操作后,从系统中删除oldname.pyc和oldname.pyo编译文件(如果存在),否则该模块也将以旧名称导入。每个类都有\u module\u属性,虽然我相信改变这个不会改变类的名称空间 如果可能的话,可能需要使用setattr将方法或类插入到所需的模块中,尽管您可能会使您的代码对未来的同行非常混乱 您最好重命名该文件。您希望将此\uuu模块\uuu变量放在何处,以

是否只有重命名该文件才有可能?或者文件中是否有一个
\uuu模块\uuu
变量来定义其名称?

是的,您应该重命名文件。最好是在完成此操作后,从系统中删除
oldname.pyc
oldname.pyo
编译文件(如果存在),否则该模块也将以旧名称导入。

每个类都有
\u module\u
属性,虽然我相信改变这个不会改变类的名称空间

如果可能的话,可能需要使用setattr将方法或类插入到所需的模块中,尽管您可能会使您的代码对未来的同行非常混乱


您最好重命名该文件。

您希望将此
\uuu模块\uuu
变量放在何处,以便原始脚本知道要导入什么?模块由文件名识别,并在
sys.path
变量中定义的路径中查找


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

如果您真的想使用“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

现在,您可以在任何地方使用
导入新名称

导入模块,您可以使用as更改导入模块时使用的名称:

import foo as bar
print bar.baz

当您导入模块名时,Python解释器会在PYTHONPATH中查找文件名。所以,在不更改文件名的情况下,无法更改该名称。但你当然可以做到:

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 egg,并在site packages目录中创建了一个软链接,从而使“bsddb”和“bsddb3”在python中都是同一个属性,而不是更改所有属性中的导入。您可以通过如下所示的module属性设置模块

函数模块
您甚至可以创建装饰器来更改文件中特定函数的模块名称,例如:

def set_模块(模块):
“”用于重写函数或类上的_模块的装饰程序。
用法示例::
@set_模块('numpy')
def示例():
通过
断言示例.\uuuu模块\uuuu=='numpy'
"""
def装饰器(func):
如果模块不是无:
函数模块
返回函数
返回
然后使用

@set_module('my_module')
def some_func(...):
请注意,因为这个装饰是为了改变个人 函数的模块名称


此示例取自numpy源代码:

重命名文件有什么问题?为什么重命名不起作用?事实上,这只是懒惰。。。我不想在Launchpad上删除并再次添加该文件。我想不出我想这样做的情况,但您可以这样做很酷:)一种情况:您希望与python 2.6和2.7兼容,但希望使用一些新的2.7 unittest功能的项目。这个技巧允许我们在仍然使用新功能的情况下让代码简单地使用“import unittest”,因此我们不需要每次切换python版本时都修改一堆import语句。太好了。示例:导入tensorflow.keras作为tf_keras导入系统模块['tf_keras']=keras然后您将能够在tensorflow版本的kerasI中使用keras示例。我希望将此应用于这样的示例:我有一个pname模块,并开发了一个修改后的pname_dev模块。在运行的脚本中,我希望在任何情况下切换import pname或pname_dev,并且脚本使用了许多行import pname.util.a,导入pname.analysis.run。。。。然后,我不想修改pname的所有行,我只想将原始模块更改为pname_orig,然后让pname选择性地指示pname_orig或pname_dev。我希望这对它有用。