Question :
When using setuptools, I can not get the installer to pull in any package_data
files. Everything I’ve read says that the following is the correct way to do it. Can someone please advise?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
where myapp/data/
is the location of the data files.
Answer #1:
I realize that this is an old question, but for people finding their way here via Google: package_data
is a low-down, dirty lie. It is only used when building binary packages (python setup.py bdist ...
) but not when building source packages (python setup.py sdist ...
). This is, of course, ridiculous — one would expect that building a source distribution would result in a collection of files that could be sent to someone else to built the binary distribution.
In any case, using MANIFEST.in
will work both for binary and for source distributions.
Answer #2:
I just had this same issue. The solution, was simply to remove include_package_data=True
.
After reading here, I realized that include_package_data
aims to include files from version control, as opposed to merely “include package data” as the name implies. From the docs:
The data files [of include_package_data] must be under CVS or Subversion control
…
If you want finer-grained control over what files are included (for example, if
you have documentation files in your package directories and want to exclude
them from installation), then you can also use thepackage_data
keyword.
Taking that argument out fixed it, which is coincidentally why it also worked when you switched to distutils, since it doesn’t take that argument.
Answer #3:
Following @Joe ‘s recommendation to remove the include_package_data=True
line also worked for me.
To elaborate a bit more, I have no MANIFEST.in
file. I use Git and not CVS.
Repository takes this kind of shape:
/myrepo
- .git/
- setup.py
- myproject
- __init__.py
- some_mod
- __init__.py
- animals.py
- rocks.py
- config
- __init__.py
- settings.py
- other_settings.special
- cool.huh
- other_settings.xml
- words
- __init__.py
word_set.txt
setup.py
:
from setuptools import setup, find_packages
import os.path
setup (
name='myproject',
version = "4.19",
packages = find_packages(),
# package_dir={'mypkg': 'src/mypkg'}, # didnt use this.
package_data = {
# If any package contains *.txt or *.rst files, include them:
'': ['*.txt', '*.xml', '*.special', '*.huh'],
},
#
# Oddly enough, include_package_data=True prevented package_data from working.
# include_package_data=True, # Commented out.
data_files=[
# ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]),
],
install_requires=[ 'jsonschema',
'logging', ],
entry_points = {
'console_scripts': [
# Blah...
], },
)
I run python setup.py sdist
for a source distrib (haven’t tried binary).
And when inside of a brand new virtual environment, I have a myproject-4.19.tar.gz
, file,
and I use
(venv) pip install ~/myproject-4.19.tar.gz
...
And other than everything getting installed to my virtual environment’s site-packages
, those special data files get installed to /opt/local/myproject/data
and /opt/local/myproject/etc
.
Answer #4:
include_package_data=True
worked for me.
If you use git, remember to include setuptools-git
in install_requires
. Far less boring than having a Manifest
or including all path in package_data
( in my case it’s a django app with all kind of statics )
( pasted the comment I made, as k3-rnc mentioned it’s actually helpful as is )
Answer #5:
Update: This answer is old and the information is no longer valid. All setup.py configs should use import setuptools
. I’ve added a more complete answer at https://stackoverflow.com/a/49501350/64313
I solved this by switching to distutils. Looks like distribute is deprecated and/or broken.
from distutils.core import setup
setup(
name='myapp',
packages=['myapp'],
package_data={
'myapp': ['data/*.txt'],
},
)
Answer #6:
I had the same problem for a couple of days but even this thread wasn’t able to help me as everything was confusing. So I did my research and found the following solution:
Basically in this case, you should do:
from setuptools import setup setup( name='myapp', packages=['myapp'], package_dir={'myapp':'myapp'}, # the one line where all the magic happens package_data={ 'myapp': ['data/*.txt'], }, )
Answer #7:
Ancient question and yet… package management of python really leaves a lot to be desired. So I had the use case of installing using pip locally to a specified directory and was surprised both package_data and data_files paths did not work out. I was not keen on adding yet another file to the repo so I ended up leveraging data_files and setup.py option –install-data; something like this
pip install . --install-option="--install-data=$PWD/package" -t package
Answer #8:
Moving the folder containing the package data into to module folder solved the problem for me.
See this question: MANIFEST.in ignored on “python setup.py install” – no data files installed?