Let’s take the following project layout:
$ ls -R .
.:
package setup.py
./package:
__init__.py dir file.dat module.py
./package/dir:
tool1.dat tool2.dat
And the following content for setup.py:
$ cat setup.py
from distutils.core import setup
setup(name='pyproj',
version='0.1',
packages=[
'package',
],
package_data={
'package': [
'*',
'dir/*',
],
},
)
As you can see, I want to include all non-Python files in package/ and package/dir/ directories. However, running setup.py install would raise the following error:
$ python setup.py install
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/package
copying package/module.py -> build/lib/package
copying package/__init__.py -> build/lib/package
error: can't copy 'package/dir': doesn't exist or not a regular file
What gives?
In your
package_data, your'*'glob will matchpackage/diritself, and try to copy that dir as a file, resulting in a failure. Find a glob that won’t match the directorypackage/dir, rewriting yoursetup.pyalong these lines:Given your example, that’s just changing
'*'to'*.dat', although you’d probably need to refine your glob more than that, just ensure it won’t match'dir'