python setup.py 配置在自定义目录中安装文件

Posted

技术标签:

【中文标题】python setup.py 配置在自定义目录中安装文件【英文标题】:python setup.py configuration to install files in custom directories 【发布时间】:2012-05-14 13:10:14 【问题描述】:

我想创建一个 setup.py,它将我的文件安装到自定义目录中。我有一个特定的前缀,我想得到以下结果:

/my/prefix/
  bin/
    script.sh
  libexec/
    one.py
    two.py
    ...
  lib/pythonX.Y/site-packages/
    package/...

我的初始项目如下:

/
  script.sh
  one.py
  two.py
  ...
  setup.py
  package/...
    __init__.py
    ...

实现这一目标的最佳方法是什么?我希望以后能够安装它:

python setup.py install --prefix=/my/prefix

我可以将“包”很好地安装在正确的目录中,因为 --prefix 下的 lib/pythonX.Y/site-packages 是默认位置。但是有没有一种干净的方法可以将 script.sh 放入“bin”,将其他 python 文件放入“libexec”?我认为实现这一目标的唯一方法是在我的 setup.py 脚本中手动复制这些文件。也许有更清洁、更标准的方法来做到这一点?

(编辑)

解决方案

我最终得到了这样的 setup.py:

setup(name='mylib',
  scripts=['script.sh'],
  data_files=[('libexec', ['one.py', 'two.py'])]
)

当然,您可以为 libexec 遍历所有 python 文件,但我只需要 2-3 个 python 文件。

(编辑2)

此外,我可以使用以下内容设置 setup.cfg:

[install]
prefix=/my/prefix

而不是python setup.py install --prefix=/my/prefix 我可以这样做:

python setup.py install

【问题讨论】:

这里有一些有用的文档:docs.python.org/2/install/… 和这里 docs.python.org/3/distutils/introduction.html 【参考方案1】:

脚本通过使用设置函数的scripts 参数来处理。对于 libexec,您可以将它们视为数据文件并使用数据选项。

setup(...
    scripts=glob("bin/*"),
    data_files=[(os.path.join(sys.prefix, 'libexec', 'mypackage'), glob("libexec/*"))],
    ...
)

我不确定 --prefix 选项如何使用,我从未尝试过。

【讨论】:

谢谢! data_files 为我做了。另一个问题,我可以有一个默认的“前缀”吗?如果用户没有指定一个,我想使用我自己的(而不是 python 默认)。 您可以在 setup.cfg 文件中设置选项默认值。它位于带有节和名称-值对的 .ini 样式选项文件中。命令行选项直接转换为那里的选项(删除--等)。 如果您打算在setup.py 中使用libexec,那么在Python 包中的某些文件中引用libexec 的最佳方式是什么? setup.py 可以像 autoconf @libexecdir@ 一样进行宏替换吗?

以上是关于python setup.py 配置在自定义目录中安装文件的主要内容,如果未能解决你的问题,请参考以下文章

setup.py 拉入非 Python github repos 并将它们放在正确的目录中?

Python setup.py:如何让 find_packages() 识别子目录中的包

我在 setup.py 中需要啥选项才能在正确的目录中创建包?

关于 cmdclass 参数的 pip3 和 `python3 setup.py install` 之间的区别

从 setup.py 检索 python 模块自己的版本 [重复]

distutils:如何将用户定义的参数传递给 setup.py?