Python 如何为需要其他源项目的项目构建控制盘?

Python 如何为需要其他源项目的项目构建控制盘?,python,python-wheel,Python,Python Wheel,我有一个项目a,它对B和C(恰好在git子模块中)具有源(“编辑”)依赖关系。我有这样一个需求文件: [requirements.txt] nose -e B/src -e C/src My setup.py将这些软件包列为deps: [setup.py] install_requires=[nose, B, C] 但是,当我在另一个客户机项目X中安装控制盘时,找不到这些“源”依赖项(它们不是A控制盘的一部分) 我必须为每个子项目创建单独的二进制发行版吗?不要将B和C放在install\u

我有一个项目a,它对B和C(恰好在git子模块中)具有源(“编辑”)依赖关系。我有这样一个需求文件:

[requirements.txt]
nose
-e B/src
-e C/src
My setup.py将这些软件包列为deps:

[setup.py]
install_requires=[nose, B, C]
但是,当我在另一个客户机项目X中安装控制盘时,找不到这些“源”依赖项(它们不是A控制盘的一部分)


我必须为每个子项目创建单独的二进制发行版吗?

不要将
B
C
放在
install\u requires
列表中。这是通过奶酪店(即pypi)发布的包装。您必须将
B
C
放在
packages
列表下

请记住,
install\u requires
中的依赖项在构建python发行版(二进制或非二进制)时不会捆绑在一起,但是
packages
中的包会与发行版捆绑在一起(您可以将它们视为“模块”而不是独立的库,因为它们是独立的)

为了解释这一点,如果你有,如果你建造了你的轮子,你把它给了我,我试着安装它,那么
nose
软件包将从奶酪展中取出并安装
B
C
也将尝试以这种方式安装,但它们失败,因为您从未构建它们并将它们发布到pypi服务器

实际上你有两个选择。第一种方法是分别构建
B
C
,并将它们分别发布到pypi服务器(或您自己的pypi服务器)。另一个选项是将
B
C
作为包包含在
setup.py
文件中。这样,当您构建主项目时,
B
C
都包含在您的版本中(即您案例中的轮子文件)

如果您选择单独构建本地依赖项并将它们上载到pypi服务器,那么您的设置应该可以正常工作。否则,如果选择其他选项,则必须将本地依赖项移动到包列表中。以下是在这种情况下可能创建的setup.py示例:

from setuptools import setup

setup(
    name='myproject',
    version='1.0.0',
    author='myself',
    author_email='myself@mywebsite.com',
    install_requires=['nose'],
    packages==['B', 'C']
    package_dir={'A': 'path/to/A/directory', 'B': 'path/to/B/dir'}
) 

不要将
B
C
放在
install\u requires
列表中。这是通过奶酪店(即pypi)发布的包装。您必须将
B
C
放在
packages
列表下

请记住,
install\u requires
中的依赖项在构建python发行版(二进制或非二进制)时不会捆绑在一起,但是
packages
中的包会与发行版捆绑在一起(您可以将它们视为“模块”而不是独立的库,因为它们是独立的)

为了解释这一点,如果你有,如果你建造了你的轮子,你把它给了我,我试着安装它,那么
nose
软件包将从奶酪展中取出并安装
B
C
也将尝试以这种方式安装,但它们失败,因为您从未构建它们并将它们发布到pypi服务器

实际上你有两个选择。第一种方法是分别构建
B
C
,并将它们分别发布到pypi服务器(或您自己的pypi服务器)。另一个选项是将
B
C
作为包包含在
setup.py
文件中。这样,当您构建主项目时,
B
C
都包含在您的版本中(即您案例中的轮子文件)

如果您选择单独构建本地依赖项并将它们上载到pypi服务器,那么您的设置应该可以正常工作。否则,如果选择其他选项,则必须将本地依赖项移动到包列表中。以下是在这种情况下可能创建的setup.py示例:

from setuptools import setup

setup(
    name='myproject',
    version='1.0.0',
    author='myself',
    author_email='myself@mywebsite.com',
    install_requires=['nose'],
    packages==['B', 'C']
    package_dir={'A': 'path/to/A/directory', 'B': 'path/to/B/dir'}
) 

非常感谢您的详细回复。我理解你的解释(我需要选项2),但我无法让事情正常进行:我现在可以构建一个轮子,但它的文件大小看起来太小,并且缺少许多模块。我的模块B和C都有许多子目录。1). 包=['B','C']会自动拾取这些吗?2). 如何检查要检查的轮子的内容物?3). 我正在运行“python setup.py bdist_wheel”,对吗?4.我似乎必须从与setup.py相同的目录下运行它(例如,我不能执行“python src/main/python/setup.py”),否则它会以静默方式失败。好的,所以我现在意识到我可以向packages属性添加多个find_packages()调用,所以我现在可以工作了。再次感谢。@rsb所以您有了
'B.find_packages()“
?您能提供一个如何放置多个
find_packages()
调用的示例吗?bdist_wheel是否适合您?我已经读到二进制发行版依赖于平台形式,是这样吗?非常感谢您的详细回答。我理解您的解释(我需要选项2),但我无法让事情正常运行:我现在可以构建一个控制盘,但它的文件大小看起来太小,并且缺少许多模块。我的模块B和C都有许多子目录。1)包=['B','C']会自动拾取这些文件吗?2)我如何检查控制盘的内容以进行检查?3)我正在运行“python setup.py bdist_wheel””“是这样吗?4.我似乎必须从与setup.py相同的目录下运行它(例如,我不能执行“python src/main/python/setup.py”),否则它会以静默方式失败。好的,所以我现在意识到我可以向packages属性添加多个find_packages()调用,所以我现在可以工作了。再次感谢。@rsb所以您有了
'B.find_packages()“
?能否提供一个示例,说明如何放置多个
find_packages()
调用?bdist_wheel是否适用于您?我已经了解到二进制发行版依赖于平台,是这样吗?