Hello, I have a Python program (of which I am upstream) and I want to package it. However, it has some private modules and I don't know how to treat them. Section 3.1.1 of the Python Packaging Policy says they should be in /usr/share/. This makes sense, being private data of the package.[1] However, this doesn't seem to be how Python programs normally work. I asked on IRC (freenode:#python), and the response was that Python programs don't have the concept of "private modules". Any module, no matter how program-specific, is installed publicly. This feels wrong for me, and not "the Debian Way". This wouldn't be a problem in itself, but I need support from the Python system to make things work: my program needs to import my private module, which means its directory must be in sys.path. But how do I get it there? I see several options, none of which seems really good: 1. Hard-code the directory in the program. + It works. - It will then only work on Debian - It cannot run from a different path. 2. Let the upstream program assume that the module is in the search path (either installed publicly or in the same directory as the script). Use a debian patch to add Debian's private path to it. + It works. + The upstream script works for non-Debian people. - The patch may not apply cleanly in a next version, so it slightly increases maintainance burden. - The packaged program is not the upstream version (is that actually a problem?) 3. Create a module for handling this. I import the module and call a function on it providing my package name. It will add the required directories to sys.path. + This would be great, if it worked, but: - Othes operating systems don't have this module, so even though the approach is intended to make it more portable, it actually makes it Debian-specific. 4. Virtualenv was suggested on IRC. I'm not sure how I should use it; it seems like a tool for users with little permissions on the system, not for a package which can access anything. But I might be wrong, so I wanted to mention it. + ? - ? 5. Create a wrapper executable script which just runs the program from /usr/share. Have the private module in the same directory as the program. (I've seen this used by freealchemist.) + It works. - It's a clumsy workaround. 6. Make /usr/bin/program a symlink to the actual file in the private directory. It will then search in its real place. (I've seen this used by angrydd.) + It works. + It's not as clumsy. - It still seems to be a workaround. - It is not obvious to a user who copies the file and changes it, why the copy doesn't find its modules. Any thoughts on this are welcome. Thanks, Bas Ps: please Cc me on replies, I'm not subscribed to this list. (And keep these lines, so I alse get replies to replies.) [1] Actually, it says it should go in /usr/share/modulename/, while I would expect it to go in /usr/share/packagename/.../modulename/. Am I misreading this? In particular, should package foo (with private module bar) really create /usr/share/bar?
Attachment:
signature.asc
Description: OpenPGP digital signature