首页 > 解决方案 > python setup.py sdist bdist_wheel 引发`TypeError:预期的字符串或类似字节的对象`

问题描述

问题陈述

当设置packages=[find_packages()]我遇到 TypeError 时。将 packages 变量直接设置为结果字符串 ( "spark_jobs") 时,我不再遇到意外异常。我想知道是否有人明白这里发生了什么。

供参考,我在 python 3.9 上运行。

安装程序.py

  setup(
      name=f"{PROJECT_NAME}",
      version=f"{VERSION}",
      description="f{PROJECT_DESCRIPTION}",
      long_description=README,
      long_description_content_type="text/markdown",
      url=f"{url}",
      author=f"{author}",
      classifiers=[
          "Programming Language :: Python :: 3",
          "Programming Language :: Python :: 3.7",
          "Programming Language :: Python :: 3.8",
          "Programming Language :: Python :: 3.9",
      ],
      packages=[find_packages()],
      include_package_data=True,
      install_requires=INSTALL_REQUIRES,
      tests_require=TESTS_REQUIRE,
  )

错误

python setup.py sdist bdist_wheel
Traceback (most recent call last):
  File "setup.py", line 40, in <module>
    setup(
  File "/Users/alexlordthorsen/.venvs/data_platform/lib/python3.8/site-packages/setuptools/__init__.py", line 145, in setup
    return distutils.core.setup(**attrs)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/distutils/core.py", line 108, in setup
    _setup_distribution = dist = klass(attrs)
  File "/Users/alexlordthorsen/.venvs/data_platform/lib/python3.8/site-packages/setuptools/dist.py", line 445, in __init__
    _Distribution.__init__(self, {
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/distutils/dist.py", line 292, in __init__
    self.finalize_options()
  File "/Users/alexlordthorsen/.venvs/data_platform/lib/python3.8/site-packages/setuptools/dist.py", line 734, in finalize_options
    ep.load()(self, ep.name, value)
  File "/Users/alexlordthorsen/.venvs/data_platform/lib/python3.8/site-packages/setuptools/dist.py", line 329, in check_packages
    if not re.match(r'\w+(\.\w+)*', pkgname):
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/re.py", line 189, in match
    return _compile(pattern, flags).match(string)
TypeError: expected string or bytes-like object

设置断点

当我设置断点时,我发现结果是一个带有单个字符串的列表。

(Pdb) find_packages()
['spark_jobs']

令人困惑的是,如果我packages=['spark-jobs']直接设置,我将不再遇到上述错误,但我也会得到一个空的

标签: pythonpython-3.xdistutils

解决方案


find_packages()已经返回一个列表,您不需要将其包装在另一个列表中。正确的语法只是

  packages=find_packages(),

包名中packages=['spark-jobs']的名称必须与目录的拼写完全一样(并且目录名必须遵循 Python 命名规则)所以将其修复为

packages=['spark_jobs']

推荐阅读