2010-08-29 70 views
54

這裏是我的精簡與非代碼的東西setup.py腳本刪除:MANIFEST.in忽略「python setup.py install」 - 沒有安裝數據文件?

#!/usr/bin/env python 

from distutils.core import setup 
from whyteboard.misc import meta 


setup(
    name = 'Whyteboard', 
    version = meta.version, 

    packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub', 
       'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'], 

    py_modules = ['whyteboard'], 
    scripts = ['whyteboard.py'], 
) 

MANIFEST.in:

include *.txt 
include whyteboard-help/*.* 
recursive-include locale *.mo 
recursive-include images *.png 

當我運行 「蟒蛇的setup.py安裝sdist」 我得到一個用「whyteboard-0.41」根文件夾,裏面帶有我的locale/images /和whyteboard-help /文件夾,很好.tar.gz。這也有我的whyteboard.py腳本,它從whyteboard源碼包中啓動我的程序。

所以:

whyteboard/ 
├── locale/ 
├── images 
├── whyteboard-help/ 
├── whyteboard/ 
│ ├── __init__.py 
│ └── other packages etc 
├── whyteboard.py 
├── README 
├── setup.py 
└── CHANGELOG 

這反映了我的計劃之源,是一切應該如何,並且是正確的。

但是,當我運行「python setup.py install」時,我的數據文件都沒有寫入 - 只有「whyteboard」源代碼包和whyteboard.py放在/usr/local/lib/python2.6/中DIST-包/。

理想情況下,我想要與在dist-packages中創建的.tar.gz文件中生成的目錄結構相同的目錄結構,因爲這是我的程序期望尋找其資源的方式。

如何獲得「安裝」來創建此目錄結構?據我所知,似乎忽略了我的清單文件。

回答

21

除了一些注意事項,以奈德的回答(這擊中的核心問題):

的Distutils內不site-packages(或dist-packages在Debian/Ubuntu的)安裝在每個項目子目錄裏面的Python包和模塊:他們正如你所見,直接安裝到site-packages。因此,sdist中包含的whyteboard-xx目錄不會以最終安裝的形式存在。這

一個含義是,你應該小心命名您的data_files在澄清它們屬於什麼項目,因爲這些文件/目錄直接安裝到全球site-packages目錄,而不是內部的任何含whyteboard目錄的方式。

或者您可以改爲使用whyteboard程序包的數據package_data(這意味着它需要位於該程序包內,即在__init__.py旁邊),然後這不是問題。

最後,在packages中同時包含whyteboard.py模塊py_moduleswhyteboard/__init__.py包沒有多大意義。這兩者是相互排斥的,如果兩者都有,那麼whyteboard.py模塊將被導入忽略,以支持相同名稱的包。

如果whyteboard.py只是一個腳本,並且不打算導入,那麼您應該使用scripts選項,並將其從py_modules中刪除。

+1

這很不幸。我不喜歡有包數據的想法 - 對我來說,這些資源更適合生活在源目錄之外。我也不喜歡必須擁有以程序名稱爲前綴的目錄名稱(即使我已經爲幫助文件執行此操作)。嗯.. – 2010-08-30 14:30:13

48

MANIFEST.in告訴Distutils哪些文件要包含在源碼分發中,但它不會直接影響安裝的文件。爲此,您需要在setup.py文件中包含相應的文件,通常爲package dataadditional files

+0

我試着添加一個包數據列表,但沒有使用我指定的文件。我不確定這些文件的位置是否相對於整個安裝包安裝。無論如何,它仍然沒有在我期望的正確的目錄結構中寫入我的文件。 – 2010-08-30 13:24:02

+0

此答案中鏈接的文檔爲您提供了有關安裝data_files和package_data的所有信息。如果這些選項不適合您,請使用您嘗試的確切語法,結果以及您的預期更新您的問題。 – 2010-08-30 13:29:59

+3

這適用於我:在setup.py的data_packages裏面複製我的MANIFEST.in條目可以使所有的東西都起作用。謝謝奈德 - 我多年來都沒有理解這一點。希望現在我的distutils/setuptools /發佈經驗會更有意義。 – 2011-03-04 09:07:54

8

在Mac OSX上運行python 2.6.1,除了在setup.py中使用data_files參數,我絕對沒有運氣。所有與MANIFEST.in一起簡單地導致文件被包含在dist包中,但從未安裝。我檢查了一些其他軟件包,他們確實使用data_files來指定其他文件。

我創建了一個簡短的功能,以幫助枚舉

從目錄樹中的所有文件(TARGET_DIR,[文件列表])格式data_files預計:

def gen_data_files(*dirs): 
    results = [] 

    for src_dir in dirs: 
     for root,dirs,files in os.walk(src_dir): 
      results.append((root, map(lambda f:root + "/" + f, files))) 
    return results 

現在我可以只需在我的設置調用中調用此函數:

setup(... data_files = gen_data_files("docs", "lib") ... 

並且安裝了那些樹中的所有內容。

+8

這很好,但是它安裝在哪裏?對於我來說,當使用「pip安裝」時,我的data_files會進入我的virtualenv的根目錄(即所有virtualenv的軟件包共享一個目錄)。如果使用「setup.py install」,那麼我的data_files會進入「包/ .egg /「。如果這些文件是運行時需要的數據,那麼在任何情況下,我的代碼都無法找到這些文件,當然,我必須在運行時搜索這兩個目錄。如果這些文件是我的LICENSE文件,則無論如何,我的用戶都可以從我的源代碼獲得LICENSE。困惑。 – 2012-02-12 11:57:52

7

你應該使用的setuptools:

#!/usr/bin/env python 

from setuptools import setup, find_packages 
from whyteboard.misc import meta 


setup(
    name = 'Whyteboard', 
    version = meta.version, 

    packages = find_packages(), 
    include_package_data=True, 

    py_modules = ['whyteboard'], 
    scripts = ['whyteboard.py'], 
) 

這是不實際使用清單文件中做的工作,但它包含所有需要的文件。

+1

不適用於我。必須使用MANIFEST文件 – warvariuc 2013-05-03 16:28:33

+0

這確實對我來說** setuptools **。我構建了Debian軟件包,並且只有在添加了'include_package_data = Tru'後,我纔看到'package_data'字典中列出的glade文件出現在正確的位置。 – mlt 2013-07-11 07:18:55

11

我不知道爲什麼我的MANIFEST.in文件被忽略,當我跑python setup.py install - 原來include_package_data=True解決了這個問題。 package_data選項實際上不是必需的。

+1

噢,我的上帝,我一直在努力掙扎數小時..非常感謝! – DenisFLASH 2016-11-10 13:39:21