我有一个 setup.py
文件,它检查用户是否有 setuptools
,如果没有,我就被迫使用 distutils
。问题是,为了确保安装了子模块,我使用了 setuptools
' find package:
from setuptools import setup, find_packages
packages = find_packages()
然后从那里继续。
但是,我不确定如何使用 distutils
来做到这一点。是否有等效的功能,或者我是否必须手动查找其中包含 __init__.py
的子目录?如果是这样,我是否可以接受要求 setuptools
安装我的包而忘记 distutils
?
干杯。
最佳答案
使用setuptools是完全可以接受的; PyPI 上的绝大多数包已经这样做了。
如果您想重新发明find_packages()
轮子,那么是的,寻找其中包含__init__.py
文件的目录。这就是setuptools.PackageFinder
class做。一个简化的重新实现是:
import os
from distutils.util import convert_path
def find_packages(base_path):
base_path = convert_path(base_path)
found = []
for root, dirs, files in os.walk(base_path, followlinks=True):
dirs[:] = [d for d in dirs if d[0] != '.' and d not in ('ez_setup', '__pycache__')]
relpath = os.path.relpath(root, base_path)
parent = relpath.replace(os.sep, '.').lstrip('.')
if relpath != '.' and parent not in found:
# foo.bar package but no foo package, skip
continue
for dir in dirs:
if os.path.isfile(os.path.join(root, dir, '__init__.py')):
package = '.'.join((parent, dir)) if parent else dir
found.append(package)
return found
这会忽略 setuptools.find_packages()
的 include
和 exclude
参数。
关于python - distutils 相当于 setuptools 的 `find_packages` 是什么? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37350816/