【问题标题】:Setup.py inside installed module已安装模块内的 Setup.py
【发布时间】:2014-01-17 22:43:01
【问题描述】:

对于像下面这样的目录结构,我无法将xy 设为可导入包。

xy
├── __init__.py
├── z
│   ├── __init__.py
│   └── stuff.py
└── setup.py

如果setup.py 是一个目录,我可以使用

from setuptools import setup
setup(name='xy',
      packages=['xy'])

但除此之外,package_dirpackages 的组合没有让我import xy,只有import z。不幸的是,moving the setup.py 目录向上并不是一个真正的选择,因为硬编码路径数量过多。

【问题讨论】:

  • 我不确定我是否理解您的问题,但您是否要导入 xy 以便可以访问 xy.setup?
  • 我的目标是访问xy.z,不一定是xy.setup,但我认为xy.setup 是可以访问的,除非某处明确删除。
  • 如果你在 xy/__init__.py 中写上import z,通过导入 xy,你应该可以毫不费力地访问 xy.z。
  • 不幸的是,我正在尝试将 setup.py 添加到比此处列出的更大的代码库中,并且将整个代码库导入 __init__ 文件即使有一些 @987654336 也不会令人愉快@循环。
  • 这超出了我的知识范围,但我的印象是您无法逃避这样一个事实,即最终您已经明确声明了所需的导入。 __all__ 会让它变得愉快吗?

标签: python setup.py


【解决方案1】:

我偶然发现了同样的问题,但没有找到任何合适的解决方案(阅读“使用预定义的设置选项”)。

我最终制作了一个丑陋的补丁:我将所有内容移动到一个名为 package 的新子目录中,然后再将所有内容移回。

import os, errno

# create directory
directory = 'xy/'
try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

# move important files
move = [ ... ]

for fname in move:
    os.rename(fname, directory + fname)

setup(
    ...
    package_dir = {'': '.'},
    ...
)


# move back
for fname in move:
    os.rename(directory + fname, fname)

【讨论】:

    【解决方案2】:

    有关如何使用 package_dirpackages 来帮助此类项目的想法,请参阅以下答案:https://stackoverflow.com/a/58429242/11138259

    这里的案例简而言之:

    #!/usr/bin/env python3
    import setuptools
    setuptools.setup(
        # ...
        packages=['xy', 'xy.z'],
        #packages=setuptools.find_packages('..')   # only if parent directory is otherwise empty
        package_dir={
            'xy': '.',
        },
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多