setup.py sdist排除子目录中的包

时间:2014-10-24 09:56:14

标签: python setuptools

我想要打包以下项目结构:

├── doc
│   └── source
├── src
│   ├── core
│   │   ├── config
│   │   │   └── log.tmpl
│   │   └── job
│   ├── scripts
│   └── test
└── tools

我想在core下打包src,但排除test。这是我尝试失败的原因:

      setup(name='core',
      version=version,  
      package_dir = {'': 'src'}, # Our packages live under src but src is not a package itself
      packages = find_packages("src", exclude=["test"]), # I also tried exclude=["src/test"]
      install_requires=['xmltodict==0.9.0',
                        'pymongo==2.7.2',
                        'ftputil==3.1',
                        'psutil==2.1.1',
                        'suds==0.4',
                        ],
      include_package_data=True,
      )

我知道我可以使用MANIFEST.in文件排除test,但如果您能通过setupfind_packages告诉我如何执行此操作,我们会很高兴。

更新

经过多次游戏后,我意识到使用python setup.py install构建程序包符合我的预期(即不包括test)。但是,发出python setup.py sdist会导致包含所有内容(也就是说,它会忽略我的exclude指令)。我不知道它是错误还是功能,但仍有可能使用sdist排除MANIFEST.in中的文件。

4 个答案:

答案 0 :(得分:24)

find_packages("src", exclude=["test"])有效 诀窍是删除陈旧文件,例如core.egg-info目录。在您的情况下,您需要删除src/core.egg-info

这是setup.py我用过的:

from setuptools import setup, find_packages

setup(name='core',
      version='0.1',
      package_dir={'':'src'},
      packages=find_packages("src", exclude=["test"]), # <- test is excluded
      ####packages=find_packages("src"), # <- test is included
      author='J.R. Hacker',
      author_email='jr@example.com',
      url='http://stackoverflow.com/q/26545668/4279',
      package_data={'core': ['config/*.tmpl']},
)

要创建分发版,请运行:

$ python setup.py sdist bdist bdist_wheel

要启用后一个命令,请运行:pip install wheel

我检查了创建的文件。它们不包含test,但包含core/__init__.pycore/config/log.tmpl个文件。

答案 1 :(得分:5)

在项目根目录的MANIFEST.in中,添加

prune src/test/

然后使用python setup.py sdist

构建包

答案 2 :(得分:1)

我可能只使用find_packages文档中定义的通配符。我倾向于使用*test**tests*,因为我们只保存带有单词test的测试文件名。简单又容易^-^。

setup(name='core',
  version=version,  
  package_dir = {'': 'src'}, # Our packages live under src but src is not a package itself
  packages = find_packages("src", exclude=['*tests*']), # I just use wild card. Works perfect ^-^
  install_requires=['xmltodict==0.9.0',
                    'pymongo==2.7.2',
                    'ftputil==3.1',
                    'psutil==2.1.1',
                    'suds==0.4',
                    ],
  include_package_data=True,
  )

仅供参考:

我还建议将以下内容添加到.gitignore中。

build
dist
pybueno.egg-info

然后将构建和打包软件包移至pypi或将您的私有存储库移至CI / CD,以使整个设置看起来整洁。

答案 3 :(得分:0)

假设您的文件夹名为 tests 而非 test ,则应使用以下代码:

  setup(name='core',
  version=version,  
  package_dir = {'': 'src'}, # Our packages live under src but src is not a package itself
  packages = find_packages('src', exclude=['tests'])
  install_requires=['xmltodict==0.9.0',
                    'pymongo==2.7.2',
                    'ftputil==3.1',
                    'psutil==2.1.1',
                    'suds==0.4',
                    ],
  include_package_data=True,
  )