2012-01-11 112 views
2

我知道imp模塊可以在Python 3中使用來加載模塊和包。如何在不加載模塊信息的情況下獲取?

但是,在我實際加載它之前,我想了解一些有關模塊的信息(如__version__)。

我怎樣才能得到這些信息? imp我沒有找到任何有用的方法。

現在,我看不到比自己解析imp.find_module找到的文件更好。

+0

如果導入模塊,檢查版本,如果結果是錯誤的,從'sys.modules'中刪除它又如何?如果這是由於某種原因而不是選項,那麼使用'ast'模塊解析文件肯定比自己解析文件更好。 – 2012-01-11 11:06:01

+0

你爲什麼要這樣?之所以改變答案。 – 2012-01-11 13:44:59

+0

我正在構建一個插件管理器,其中有一個顯示已加載/可用插件的AddonManager(就像在現代瀏覽器中一樣)。每個插件都必須實現'__version__'和'__desc__',我想爲「可用但未加載的插件」顯示這些值。 – rds 2012-01-11 13:50:54

回答

1

這取決於模塊是什麼,以及它是否安裝等。例如,您想要__version__,但在模塊中沒有保證存在的東西。您在模塊上擁有的標準屬性,如__cached__,__doc__,__file__,__name__,__package__都是在您導入時創建的。

如果該模塊尚未安裝,即它是一個下載的tgz或其他東西,它可能會有一個setup.py文件,然後您可以從該發行版中獲得大量信息,如果您使用distutils提取它。例如,我在pyroma中執行此操作。

如果安裝它可能有一個EGG-INFO目錄。在那裏你會發現一堆文件和很多信息。它大部分在PKG-INFO文件中。爲此,每個模塊都必須使用Distribute(或Setuptools)。

如果它沒有EGG-INFO/PKG-INFO文件,那麼你將不得不解析它。對於__version__,你可能只是做一個正則表達式匹配。這不會是非常通用的,但是再次,無論您尋找什麼信息都不是通用的,並且很可能不會存在,除非您確切知道您正在查看哪個模塊。

對於其他事情你可能需要一個解析器。 ast可能是最好的選擇,儘管lib2to3中的解析器也有好的一面。

+0

egg-info似乎是個好主意。我將如何能夠列出候選人模塊?我最初的想法是將模塊部署到我的應用程序的子目錄中,在這種情況下,一個簡單的'dir.list()'產生列表。 – rds 2012-02-06 15:10:31

+0

@rds:這絕對是一個很好的做法。 – 2012-02-06 19:48:12

4

你不能。 __version__只是模塊在執行時創建的對象的名稱。在您執行負責定義模塊的文件之前,它不存在。解析是一種選擇,但它只有在定義__version__的代碼是微不足道的情況下才起作用,例如,

__version__ = 'some literal' 

如果涉及更多內容,則必須至少部分執行代碼。

相關問題