Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload a pristine Python package to PyPI?

What's the magic "python setup.py some_incantation_here" command to upload a package to PyPI, in a form that can be downloaded to get the original package in its original form?

I have a package with some source and a few image files (as package_data). If I do "setup.py sdist register upload", the .tar.gz has the image files excluded. If I do "setup.py bdist_egg register upload", the egg contains the images but excludes the setup.py file. I want to be able to get a file uploaded that is just the entirety of my project -- aka "setup.py the_whole_freaking_thing register upload".

Perhaps the best way to do this is to manually tar.gz my project directory and upload it using the PyPI web interface?

Caveat: I'm trying to avoid having to store a simple project I just created in my SVN repo as well as on PyPI -- it seems like a waste of work to keep track of its history and files in two places.

like image 782
Michael Gundlach Avatar asked Apr 22 '09 20:04

Michael Gundlach


1 Answers

When you perform an "sdist" command, then what controls the list of included files is your "MANIFEST.in" file sitting next to "setup.py", not whatever you have listed in "package_data". This has something to do with the schizophrenic nature of the Python packaging solutions today; "sdist" is powered by the distutils in the standard library, while "bdist_egg" is controlled by the setuptools module.

To solve the problem, try creating a MANIFEST.in next to your setup.py file, and give it contents like this:

include *.jpg

Of course, I'm imaging that your "image files" are actual pictures rather than disk images or ISO images or something; you might have to adjust the above line if I've guessed wrong! But check out the Specifying which files to distribute section of the distutils docs, and see whether you can't get those files appearing in your .tar.gz source distribution! Good luck.

like image 115
Brandon Rhodes Avatar answered Sep 19 '22 22:09

Brandon Rhodes