我需要裝運使用多個包存儲在本地Library
目錄Python程序的集合:我們的目標是避免使用我的程序(包運在Library
目錄)之前有用戶安裝軟件包。導入Library
中包含的軟件包的最佳方式是什麼?Python包的本地集合:導入它們的最佳方式?
我嘗試了三種方法,但沒有一個看起來很完美:是否有更簡單和更健壯的方法?或者是最好的方法之一?
在第一種方法中,
Library
文件夾被簡單地添加到庫路徑:import sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library')) import package_from_Library
的
Library
文件夾在一開始就把以便隨我的程序包的優先級高於用戶安裝了相同的模塊(這種方式我確信他們有正確的版本來處理我的程序)。當Library
文件夾不在當前目錄中時,此方法也適用,這很好。但是,這種方法有缺點。我的每一個程序都會將相同路徑的副本添加到sys.path
,這是一種浪費。另外,所有程序都必須包含相同的三條路徑修改線,這違反了不重複自己原則。了上述問題的改進在於嘗試添加
Library
路徑只有一次,通過導入模塊,做到了這一點:# In module add_Library_path: sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))
,然後使用,在我的每個節目:
import add_Library_path import package_from_Library
這樣一來,由於CPython中的緩存機制,模塊
add_Library_path
只運行一次,Library
路徑只加一次到sys.path
。然而,這種方法的一個缺點是import add_Library_path
有一個看不見的副作用,並且導入的順序很重要:這使得代碼更清晰易讀,更脆弱。此外,這迫使我的程序分發,以包括用戶不會使用的add_Library_path.py
程序。from Library import module_from_Library
然而,這打破了包中:
的Python 模塊從
Library
也可以通過使其成爲一個包(空__init__.py
文件中存儲的),它允許一個做進口Library
,因爲他們可能會做類似from xlutils.filter import …
,因爲xlutils
未在sys.path
中找到而中斷。所以,這種方法的工作原理,但只有在Library
包括模塊,而不是包。
所有這些方法都有一些缺點。
是否有一種更好的方式來運送儲存在本地Library
目錄中的軟件包集合(它們使用)的程序?或者是上述方法之一(方法1?),最好的方法是?
PS:就我而言,Library
的所有軟件包都是純Python軟件包,但是適用於任何操作系統的更通用的解決方案是最好的。
PPS:我們的目標是使用戶能夠使用我的程序,而無需安裝任何東西(除了複製我經常把它們運的目錄),如上面的例子。
PPPS:更確切地說,我們的目標是有容易更新兩個我收藏的節目和來自Library
及其相關的第三方軟件包的靈活性,通過讓我的用戶做一個目錄的簡單複製包含我的程序和「隱藏」第三方軟件包的文件夾Library
。 (我做頻繁的更新,所以我不想迫使用戶更新他們的Python發行過。)
Linux?視窗? – LtWorf 2013-02-22 14:56:37
任何操作系統! – EOL 2013-02-22 23:47:09