簡體   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