Issue 13943: distutils’ build_py fails when package string is unicode (original) (raw)
Thanks for the report and patch. I think distutils was not written with Unicode in mind, or maybe even before Python had a unicode type. Technically, http://docs.python.org/distutils/setupscript#additional-meta-data says that unicode is not allowed for metadata fields (nothing is said about py_modules, packages and the like), but we’ve fixed a couple of bugs related to unicode, so I think this is a reasonable request. Can you post (part of) your failing setup script?
From py-logilab-common 0.57.1 port for FreeBSD. No patches applied:
package init file './test/init.py' not found (or not a regular file) Traceback (most recent call last): File "setup.py", line 170, in install() File "setup.py", line 166, in install **kwargs File "/usr/local/lib/python2.7/distutils/core.py", line 152, in setup dist.run_commands() File "/usr/local/lib/python2.7/distutils/dist.py", line 953, in run_commands self.run_command(cmd) File "/usr/local/lib/python2.7/distutils/dist.py", line 972, in run_command cmd_obj.run() File "/usr/local/lib/python2.7/distutils/command/build.py", line 127, in run self.run_command(cmd_name) File "/usr/local/lib/python2.7/distutils/cmd.py", line 326, in run_command self.distribution.run_command(command) File "/usr/local/lib/python2.7/distutils/dist.py", line 972, in run_command cmd_obj.run() File "/usr/local/lib/python2.7/distutils/command/build_py.py", line 93, in run self.build_packages() File "/usr/local/lib/python2.7/distutils/command/build_py.py", line 372, in build_packages self.build_module(module, module_file, package) File "/usr/local/lib/python2.7/distutils/command/build_py.py", line 333, in build_module "'package' must be a string (dot-separated), list, or tuple") TypeError: 'package' must be a string (dot-separated), list, or tuple *** Error code 1
Stop in /usr/src/ports/devel/py-logilab-common.
This package's setup.py is auto-generating the packages list with the current working directory.
def get_packages(directory, prefix):
"""return a list of subpackages for the given directory"""
result = []
for package in os.listdir(directory):
absfile = join(directory, package)
if isdir(absfile):
if exists(join(absfile, 'init.py')) or
package in ('test', 'tests'):
if prefix:
result.append('%s.%s' % (prefix, package))
else:
result.append(package)
result += get_packages(absfile, result[-1])
return result
...
packages = [modname] + get_packages(os.getcwd(), modname)
kwargs['packages'] = packages
setup(... **kwargs)
where modname is imported from pkginfo.py: distname = 'logilab-common' modname = 'common'
What's interesting is there is no explicit unicode string definition within this package list gerneration, yet the final packages list looks like:
['logilab.common', u'logilab.common.test', u'logilab.common.test.data', u'logilab.common.test.data.find_test', u'logilab.common.ureports']