2012-10-15 41 views
15

Python有能力「pseudoinstall」一攬子運行它setup.py腳本develop而不是install。這會修改python環境,以便可以從當前位置導入包(它不會複製到site-package目錄中)。這允許開發其他軟件包使用的軟件包:通過簡單的import修改源代碼並將其更改爲其餘python代碼。Python「setup.py develop」:是否可以在源代碼文件夾中創建「.egg-info」文件夾?

所有工作正常,但setup.py develop命令創建一個.egg-info文件夾與元數據在setup.py相同的水平。混合源代碼和臨時文件並不是一個好主意 - 這個文件夾需要被添加到從vcs開始並結束備份系統的多個工具的「忽略」列表中。

是否可以使用setup.py develop但在其他地方創建.egg-info目錄,所以原始源代碼不會被臨時目錄和文件污染?

+0

出於興趣,「setupy.py clean」清理完不需要的文件嗎? – pelson

+0

@pelson否,「setup.py develop」期間創建的「.egg-info」目錄不受「setup.py clean」影響。這是預料之中的,因爲這個目錄不是臨時的 - 它是「開發者安裝」的一部分。 – grigoryvp

回答

16

setup.py develop創建蟒蛇蛋,就地;它[修改]蟒蛇環境,讓包可以導入從它的當前位置。您仍然必須將其位置添加到python搜索路徑,或使用它放置的目錄作爲當前目錄。

它是develop命令的作業創建就地卵,其可以包括在編譯C的擴展,運行2to3的蟒轉換過程來創建Python3兼容的代碼,並且提供元數據其他 Python代碼可以是依靠。當您在site-packages目錄中將該包安裝爲蛋時,也會包含相同的元數據。數據當然不是臨時的(它是從您的setup.py文件中提取的,以便通過其他工具輕鬆解析)。

這樣做的目的是,在依賴於存在的元數據的更廣泛的系統使用您的包時,同時還開發包,你可以再依靠元數據。例如,在一個buildout發展的部署,我們經常使用mr.developer自動獲取源代碼給定包的過程中,當我們需要進行這項工作,它建立它作爲一個發展的雞蛋和它關係到部署,同時我們的工作在代碼上。

請注意,.egg-info目錄具有特定用途:向setuptools生態系統中的其他工具發送信號,指出您的包已安裝且可用。如果你的軟件包是你的設置中另一個蛋的依賴,那麼這個依賴就會被滿足。 pipeasy_install並且buildout不會嘗試從其他地方取蛋。

除了創建.egg-info目錄之外,唯一的其他命令所做的事情就是在原地建立擴展。那麼,你是不是要找的命令是:

setup.py build_ext --inplace 

這將做同樣的事情,但setup.py develop離開了.egg-info目錄。它也不會生成.pth文件。

沒有辦法只生成.pth文件,而忽略了.egg-info目錄生成。

從技術上講,setup.py develop還將檢查您是否已經安裝了支持命名空間包的setuptools site.py文件,但在這裏,這是不相關的。

+0

運行'build.py develop'也可以修補.pth文件我可以在受影響的計算機上導入模塊/運行應用程序。使用'setup.py build_ext --inplace'不會發生這種情況:運行這個命令不會註冊module/app,並且之後無法導入/執行:( – grigoryvp

+0

@EyeofHell:True,* only *'setup。 py開發'和'easy_install'命令生成該文件 –

+0

@EyeofHell:但是,爲什麼你反對'.egg-info'目錄而不是'.pth'文件?這兩個文件在Python中都有特定的重要用途生態系統 –

2

嘗試--install-dir選項。您可能還想使用--build-dir更改樓宇目錄。

+0

不幸的是,這是行不通的:如果使用'develop',兩者都會被忽略:(。 – grigoryvp

+0

似乎你正在使用setuptools,而不是distutils - 在distutils中沒有'develop'命令根據代碼,'develop'命令接受參數'--egg-path =',它應該做你想做的事 – mechmind

+0

我不能理解'--egg-path'做什麼,但它不工作太多,任何vlue會引發「錯誤:--egg-path必須是從安裝目錄的相對路徑「錯誤:( – grigoryvp

4

好的方式是保持特殊的目錄哪個名字是你的項目名稱中的所有源文件(使用其他語言的程序員保持自己的代碼中src目錄)。因此,如果您的setup.py文件在myproject目錄內,那麼您應該保留文件在myproject/myproject。無論主目錄中發生了什麼,此方法都會將源代碼與其他文件分開。

我的建議是使用白名單而不是黑名單 - 告訴工具忽略除myproject目錄內的所有文件。我認爲這是最簡單的方法,不要經常觸摸你的ignore列表。

相關問題