Python setup.py:data_files无法复制“目录”:不存在或不是常规文件

问题描述

我具有以下python项目结构:

.
├ setup.py
├ doc
|   ├ file.css
|   ├ file.html
|   └ file.js
└ src
    ├ matlabsources
    |             └ <several folders architecture with .m and .slx files>
    └ mypythonpackage
        ├ __init__.py
        └ <several sub packages architecture with python files>

我想将doc文件夹中的所有文件添加到我的whl分发文件中。

setuptools.setup(
    name='myproject',author='me',packages=setuptools.find_packages(where='src',include=['packages*']),package_dir={'': 'src'},data_files ={'documentation': find_data_files('doc'),'matlab': find_data_files('src/matlabsources')},include_package_data=True,install_requires=make_deps(REQS_FILENAME),python_requires='>= 2.7',# Only compatible with Python 2.7.* and 3+
    use_scm_version={'version_scheme': simple_version},# setuptools_scm: the blessed package to manage your versions by scm tags
    setup_requires=make_deps(SETUP_FILENAME),cmdclass=dict(bdist_egg=custom_bdist_egg,build=custom_build,activateIniGeneration=activateIniGeneration)
)


def find_data_files(directory):
    """
    Using glob patterns in ``package_data`` that matches a directory can
    result in setuptools trying to install that directory as a file and
    the installation to fail.

    This function walks over the contents of *directory* and returns a list
    of only filenames found.
    """

    strip = os.path.dirname(os.path.abspath(__file__))

    result = []
    for root,dirs,files in os.walk(directory):
        for filename in files:
          filename = os.path.join(root,filename)
          result.append(os.path.relpath(filename,strip))

    print("\n".join(result))
    return result

我收到以下错误

error: can't copy 'documentation': doesn't exist or not a regular file

据我所知,“文档”是相对于sys.prefix的目标目录,通常它不存在。

我正在使用以下命令进行构建:

python setup.py bdist_wheel --universal

我也有这个警告

warning: install_data: setup script did not provide a directory for 'documentation' -- installing right in 'build\bdist.win32\wheel\myproject-1.7.z_gfdc81e60.d20201112.data\data'

这让我认为我需要对setup.py进行进一步配置才能使它工作

我在哪里错了?

解决方法

假设项目目录结构为:

<html>
<div id="id" class="class">
  <child>
    Before element is <strong>showing</strong>
  </child>

</div>
<style>
  #id.class>child:before {
    content: 'before'!important;
    border: 1px solid red;
  }
</style>

</html>

使用myproject ├── doc │   ├── alpha │   │   ├── file.css │   │   ├── file.html │   │   └── file.js │   ├── file.css │   ├── file.html │   └── file.js ├── MANIFEST.in ├── setup.cfg ├── setup.py └── src    ├── matlabsources    │   ├── bravo    │   │   ├── file.m    │   │   └── file.slx    │   ├── file.m    │   └── file.slx    └── mypythonpackage    ├── charlie    │   └── __init__.py    └── __init__.py ,您可以指定要添加到_source发行版( sdist )的其他文件。

MANIFEST.in

setuptools 脚本recursive-include doc *.css recursive-include doc *.html recursive-include doc *.js recursive-include src/matlabsources *.m recursive-include src/matlabsources *.slx 应该如下所示:

setup.py

这会导致 sdist

#!/usr/bin/env python3

import setuptools

def _find_packages():
    packages = setuptools.find_packages(where='src')
    packages.append('mypythonpackage.doc')
    packages.append('matlabsources')
    return packages

def _main():
    setuptools.setup(
        # see 'setup.cfg'
        #
        packages=_find_packages(),include_package_data=True,package_dir={
            'mypythonpackage': 'src/mypythonpackage','mypythonpackage.doc': 'doc','matlabsources': 'src/matlabsources',},)


if __name__ == '__main__':
    _main()

方向盘

$ python3 -m tarfile -l dist/myproject-0.0.0.dev0.tar.gz 
myproject-0.0.0.dev0/ 
myproject-0.0.0.dev0/MANIFEST.in 
myproject-0.0.0.dev0/PKG-INFO 
myproject-0.0.0.dev0/doc/ 
myproject-0.0.0.dev0/doc/alpha/ 
myproject-0.0.0.dev0/doc/alpha/file.css 
myproject-0.0.0.dev0/doc/alpha/file.html 
myproject-0.0.0.dev0/doc/alpha/file.js 
myproject-0.0.0.dev0/doc/file.css 
myproject-0.0.0.dev0/doc/file.html 
myproject-0.0.0.dev0/doc/file.js 
myproject-0.0.0.dev0/myproject.egg-info/ 
myproject-0.0.0.dev0/myproject.egg-info/PKG-INFO 
myproject-0.0.0.dev0/myproject.egg-info/SOURCES.txt 
myproject-0.0.0.dev0/myproject.egg-info/dependency_links.txt 
myproject-0.0.0.dev0/myproject.egg-info/requires.txt 
myproject-0.0.0.dev0/myproject.egg-info/top_level.txt 
myproject-0.0.0.dev0/pyproject.toml 
myproject-0.0.0.dev0/setup.cfg 
myproject-0.0.0.dev0/setup.py 
myproject-0.0.0.dev0/src/ 
myproject-0.0.0.dev0/src/matlabsources/ 
myproject-0.0.0.dev0/src/matlabsources/bravo/ 
myproject-0.0.0.dev0/src/matlabsources/bravo/file.m 
myproject-0.0.0.dev0/src/matlabsources/bravo/file.slx 
myproject-0.0.0.dev0/src/matlabsources/file.m 
myproject-0.0.0.dev0/src/matlabsources/file.slx 
myproject-0.0.0.dev0/src/mypythonpackage/ 
myproject-0.0.0.dev0/src/mypythonpackage/__init__.py 
myproject-0.0.0.dev0/src/mypythonpackage/charlie/ 
myproject-0.0.0.dev0/src/mypythonpackage/charlie/__init__.py