什么是 distutils 等同于 setuptools 的“find_packages”? (python)
What's distutils' equivalent of setuptools' `find_packages`? (python)
我有一个 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
参数。
我有一个 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
参数。