2010-06-03 50 views
13

我正在打包一個小型Python項目作爲zip或egg文件,以便它可以分發。我已經遇到了兩種包含項目配置文件的方式,這兩種方式似乎都產生了相同的結果。2種將文件包含在Python發行版中的技術:哪種更好?

方法1:

包括此代碼在setup.py:

from distutils.core import setup 

setup(name='ProjectName', 
     version='1.0', 
     packages=['somePackage'], 
     data_files = [('config', ['config\propFiles1.ini', 
           'config\propFiles2.ini', 
           'config\propFiles3.ini'])] 
    ) 

方法2:

包括此代碼在setup.py:

from distutils.core import setup 

setup(name='ProjectName', 
     version='1.0', 
     packages=['somePackage'] 
    ) 

然後,用這行代碼創建一個MANIFEST.in文件:

include config\* 

這兩種方法有什麼不同嗎?哪一個是首選?我傾向於傾向於第一個,因爲不需要MANIFEST.in文件。但是,在第一種方法中,您必須單獨指定每個文件,而在第二種方法中,您可以只包含整個文件夾。還有什麼我應該考慮?標準做法是什麼?

+0

注意:使用os.path.join創建路徑;使用「\」是Windows特定的。 – 2010-06-03 18:32:36

+9

您也可以在所有平臺上使用'/'。請注意,如果你有像'config \ notes.txt'這樣的文件,'\ n'會變成換行符!你很幸運'\ p'不代表什麼。 – 2010-06-03 19:22:16

+0

@Ian Bicking - 感謝您的提示!我將它們全部用r作爲前綴來注意 – froadie 2010-06-03 19:52:26

回答

25

MANIFEST.in控制在撥打python setup.py sdist時將什麼文件放入分發zip文件。它確實不是控制什麼安裝。 data_files(或更好的package_data)控制什麼文件安裝(我認爲也確保文件包含在zip文件中)。對於不使用Python代碼的文件(如圖像或模板),請使用MANIFEST.in來存放您不會安裝的文件(如文檔)和package_data

+5

請注意,data_files或package_data中列出的文件不會自動包含在即將發佈的2.7版本之前的任何Python版本的sdist中(這是最後一次修復的distutils錯誤發佈週期)。因此,實際上,對於當前發佈的Python版本,如果您需要安裝文件,則必須在MANIFEST.in中的data_files/package_data和BOTH中列出它們。 – 2010-06-10 19:19:46

+1

我注意到[3.2文檔](http://docs.python.org/py3k/distutils/setupscript.html#distutils-additional-files)說「在3.1中改變:匹配package_data(或data_files)的文件會自動放入MANIFEST,如果沒有提供模板。「但是,對於我來說,在WinXP 3.2上並不是這樣的:我必須通過創建一個MANIFEST.in並將它們添加到其中來手動將它們放在那裏。 – 2011-05-09 07:51:43

+1

這很奇怪。你能打開一個錯誤報告嗎? – 2011-12-21 16:29:33