2011-12-19 51 views
14

我對setuptools相當陌生。我已經看到了一些類似的問題,它有點瘋狂,我似乎遵循我看到的建議,但setuptools仍然做一些不同於我想要的東西。setuptools麻煩 - 不包,包括數據文件

這裏是我的項目的結構:

. 
.. 
package1/ 
    __init__.py 
    abc.py 
    ... 
tests/ 
    __init__.py 
    test_package1.py 
LICENSE 
README.md 
RELEASE 
setup.py 

這裏是我的setup.py的內容:

#!/usr/bin/env python 
import os 
#from distutils.core import setup 
from setuptools import setup, find_packages 

setup(
    name='package1', 
    version='1.1', 
    test_suite="tests", 
    packages=find_packages(exclude=['tests']),  
    include_package_data=True, 
    package_data = { 
     '': ['LICENSE', 'README.md5', 'RELEASE'] 
    }, 
) 

而且,在我的清單文件我有:

include LICENSE 
include RELEASE 
include README.md 

我用下面的方法制作焦油:

python setup.py sdist 

我想:

  1. 排除從源分佈tests目錄;
  2. 在站點包目錄中有頂級,README.md,RELEASE文件,無論是在頂層還是在package1目錄中(在這一點上我都會同意)。

相反,這裏發生了什麼:

  1. tests目錄仍然是在創建tar歸檔和被安裝到站點包;
  2. 文件被複制到存檔,但不會被安裝到軟件包的站點打包目錄。

我不知道,有人可以向我解釋我做錯了什麼,以及如何解決它?

+1

爲什麼Python不愛我們......這是一個非常簡單和常見的任務:_ignore幾個文件,幷包括幾個不常見的文件package_。爲什麼這麼難呢? – maxkoryukov 2017-08-23 18:46:16

回答

15

您應該創建一個在你的包的根級別中稱爲MANIFEST.in新的文件,然後按照這些指令:

  1. 要控制哪些文件在您的tar文件結束,創建一個新的文件在你的包的根級別中稱爲MANIFEST.in。例如,您可以使用MANIFEST.in文件中的recursive-exclude從發行版中排除整個目錄。在你的情況,你需要你的MANIFEST.in文件包含:

    recursive-exclude tests * 
    
  2. 這是不常見的包括README和其他文件在site-packages目錄,但如果你真的想要,然後進屋package1和創建符號指向你想要的文件包括:

    cd package1 
    ln -s ../LICENSE 
    ln -s ../README.md 
    ln -s ../RELEASE 
    

    然後改變你的setup.py以下行:

    package_data = { 
        '': ['LICENSE', 'README.md', 'RELEASE'] 
    

    到:

    package_data = { 
        'package1': ['LICENSE', 'README.md', 'RELEASE'] 
    
0

如果你的結構是正確的:

  1. 測試文件夾是不是一個包(它不具備初始化 .py文件),所以find_package不排除它。
  2. include_package_data = True表示如果沒有明確排除,則所有版本文件都將被包含。

這樣:嘗試一個排除測試/ *在你MANIFEST.in

我希望它幫助

+2

我在測試中有__init__.py,其實只是沒有在源代碼中顯示它。事實上,如果我打印find_packages()結果,它只會返回package1。但測試文件夾仍然包含在內。 – 0x4B1D 2011-12-19 15:25:20

16

find_packages使用fnmatchcase其排除過濾。如果您排除模式相匹配的包名可以按如下測試:

>>> from fnmatch import fnmatchcase 
>>> fnmatchcase('my.package.name.tests', 'tests') 
False 

假設所有的測試項目中的生活在包名這些包tests或子包結束,下面應該足以排除所有測試代碼:

setup(
    name='package1', 
    version='1.1', 
    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),  
) 
+0

這是問題的最佳答案 – Greg 2014-10-21 05:42:38

0

MANIFEST.in會照顧它。

prune tests/ 
include LICENSE README.md RELEASE 

,如果你有靜態文件被添加,添加它們與

... 
recursive-include package1/static *