Python:使用setuptools将文件/模块分发到另一个包中

问题描述:

通常,我想分发一个模块/文件,使其成为另一个已经在site-packages下设置了目录结构的python包的一部分。Python:使用setuptools将文件/模块分发到另一个包中

对于下站点包的给定结构:

-- main_package 
    -- __init__.py 
    -- sub_package 
     -- __init__.py 
     -- bar.py 

我有一个模块foo.py,我想旁边的模块bar.py存在,无论是包sub_package下。如果我只是在一个典型的包中设置了我的回购中的结构,那么setuptools的__init__.py需要为main_packagesub_package打开现有的__init__.py文件。理想情况下,这将是一个*或sdist,可以从我们自己的pypi分发。

我试过使用py_module,但我无法将它放在除站点包下的顶层之外的任何位置。

具体来说,我试图将一个saltstack external_pillar分布到已经由salt设置的salt/pillar/structure中。有多个salt实例可能会或可能不需要external_pillar,因此将柱子捆绑到盐分布中是不可行的。

+0

为什么你想在现有的site-packages目录下安装这个模块?你期望什么行为? – FabienP

+0

我期望'import main_package.sub_package.foo'将会工作 – Silfheed

您可能正在寻找namespace packages

随着你的情况是这样的结构:

`-- main_package 
    | # no __init__.py here 
    `-- sub_package 
     |-- __init__.py 
     `-- foo.py 

的Python 3.3添加隐含命名的包从PEP 420所有这一切都需要创建一个本地命名空间包,你只需要省略__init__.py从命名空间包目录。

...

这是非常重要的,它使用的命名空间包每个发行省略了__init__.py或使用pkgutil风格__init__.py。如果任何发行版没有,它将导致命名空间逻辑失败,其他子包将不可导入。

...

最后,每个发行必须setup.py提供namespace_packages参数setup()

但是,从您的问题我不确定main_package是否已存在sub_package或不。

如果确实如此,我不确定用于扩展sub_package的结构,但不会影响其模块,您可能需要使用备用子包名称来实现此目的。

+0

“对于site-packages下的给定结构:”意味着'sub_packages'已经存在。这个解决方案不起作用,因为在你的例子中'sub_package'的'__init __。py'仍然会覆盖给定'sub_package'目录中的'__init __。py'。 – Silfheed

+0

@Silfheed,那么你可以分叉感兴趣的包并添加你的文件。或者使用原始子包,__init__和模块以及您自己的模块创建一个名称空间包。但是,用户可能会更清楚地以某种方式区分原始文件和你的文件,因此略有不同的名称可能是件好事。 – FabienP