相关疑难解决方法(0)

分布,distutils,setuptools和distutils2之间的差异?

情况

我正在尝试将一个开源库移植到Python 3.(SymPy,如果有人想知道的话.)

所以,我需要2to3在为Python 3构建时自动运行.为此,我需要使用distribute.因此,我需要移植当前系统(根据doctest)distutils.


问题

不幸的是,我不知道什么是这些模块-之间的区别distutils,distribute,setuptools.文档是最好的粗略,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上,不是全部)......等等.


问题

有人可以解释这些差异吗?我应该用什么?什么是最现代的解决方案?(Distribute顺便说一句,我也很欣赏一些关于移植的指南,但这有点超出了问题的范围......)

python packaging distutils setuptools distribute

588
推荐指数
3
解决办法
8万
查看次数

使用Python setuptools安装后脚本

是否可以将安装后的Python脚本文件指定为setuptools setup.py文件的一部分,以便用户可以运行该命令:

python setup.py install
Run Code Online (Sandbox Code Playgroud)

在本地项目文件存档,或

pip install <name>
Run Code Online (Sandbox Code Playgroud)

对于PyPI项目,脚本将在标准setuptools安装完成后运行?我希望执行可以在单个Python脚本文件中编码的安装后任务(例如,向用户提供自定义安装后消息,从其他远程源存储库中提取其他数据文件).

几年前我遇到了这个回答这个主题的答案,听起来好像当时的共识是你需要创建一个install子命令.如果仍然如此,那么有人可以提供一个如何执行此操作的示例,以便用户无需输入第二个命令来运行脚本吗?

python software-distribution setuptools pypi setup.py

82
推荐指数
3
解决办法
2万
查看次数

如何使用简单的安装后脚本扩展distutils?

我需要在安装模块和程序后运行一个简单的脚本.我在找到如何做到这一点的直接文档方面遇到了一些麻烦.看起来我需要从distutils.command.install继承,重写一些方法并将此对象添加到安装脚本.虽然细节有点模糊,但对于这样一个简单的钩子来说似乎需要付出很多努力.有谁知道一个简单的方法来做到这一点?

python distutils

38
推荐指数
3
解决办法
1万
查看次数

重写cmdclass时忽略python setuptools install_requires

我有一个setup.py看起来像这样:

from setuptools import setup
from subprocess import call
from setuptools.command.install import install

class MyInstall(install):
    def run(self):
        call(["pip install -r requirements.txt --no-clean"], shell=True)
        install.run(self)

setup(
    author='Attila Zseder',
    version='0.1',
    name='entity_extractor',
    packages=['...'],
    install_requires=['DAWG', 'mrjob', 'cchardet'],
    package_dir={'': 'modules'},
    scripts=['...'],
    cmdclass={'install': MyInstall},
)
Run Code Online (Sandbox Code Playgroud)

我需要MyInstall因为我想从github安装一些库而我不想使用dependency_links选项,因为它不鼓励(例如这里),所以我可以用requirements.txt来做这件事.

当我安装这个软件包时pip,一切都运行正常,但由于某些原因,我必须以一种纯粹的方式解决这个问题python setup.py install.它没有.

当覆盖cmdclasssetup()与我自己的类,install_requires似乎被忽略.一旦我注释掉那一行,就会安装这些软件包.

我知道例如在distutils中不支持install_requires(如果我记得很清楚),但它在setuptools中.然后cmdclass就不会有任何影响install_requires.

我用Google搜索了这个问题几个小时,在stackoverflow上找到了很多相关的答案,但不是针对这个特殊的问题.

把所有需要的包放到requirements.txt,一切都运行正常,但我想了解为什么会这样.谢谢!

python distutils setuptools install-requires

20
推荐指数
2
解决办法
4474
查看次数

是否所有python setuptools的安装后选项都已损坏?

我正在尝试打包PyQt的版本(我没有为我需要的配置提供安装程序),但我找不到任何有效的打包配置.但问题并不是PyQt特有的.

问题:为了使模块工作,它需要python的PREFIX目录中的文件.我知道这可能是不好的形式,但在我的情况下需要有一个qt.conf文件,除了使文件可用之外,我没有什么可以做的.我需要能够运行安装后脚本来创建包含已安装的PyQt路径的文件.或者至少这似乎是最好的解决方案.

我看过的选项:

  • 我可以使用python setup.py install并覆盖setuptools.command.install类.但是,这在手动运行setup.py时有效,并且需要解压缩bdist并在包文件夹中具有cmd提示符.它不适用于bdist_wininst,bdist_msi或bdist_wheel,它们更便于安装(包装点).可能,但不是一个很好的解决方案.

  • bdist_wheel似乎是一个不错的选择,但它不会在安装后运行任何东西,只会将文件放在特定的文件夹中,不包括PREFIX.

  • bdist_wininst支持安装后脚本(在创建包时通过--install-script开关),但不能与virtualenv一起使用.有一个stackoverflow答案建议运行easy_install或wheel convert,但这些选项只解包,他们不会运行安装脚本.否则,您必须更改注册表,这不是一个可接受的解决方案.

我错过了什么?有可行的选择吗?

python setuptools

14
推荐指数
1
解决办法
561
查看次数

调用`pip install`时运行自定义任务

我想让我的python包"可以安装pip".问题是该软件包具有必须在用户的init shell脚本中提供的shell脚本(例如.bashrc).

但是在安装之后,用户并不完全知道脚本的去向(大概是/usr/bin,但我们无法保证).当然,用户可以运行which myscript.sh并手动编辑他的init脚本.

但我想自动完成这一步.我可以创建一个新的distutils命令,但pip install不会调用它.我可以扩展distutils.command.install.install,但安装通过pip中断(虽然通过工作python setup.py install):

setup.py

from distutils.command.install import install

class CustomInstall(install):
def run(self):
    install.run(self)
    # custom stuff here
    do_my_stuff()

setup(..., cmdclass={'install': CustomInstall})
Run Code Online (Sandbox Code Playgroud)

贝壳

$ pip install dist/mypackage.tar.gz
Unpacking ./dist/mypackage.tar.gz
  Running setup.py egg_info for package from file:///path/to/mypackage/dist/mypackage.tar.gz

Installing collected packages: mypackage
  Running setup.py install for mypackage
    usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
       or: -c --help [cmd1 cmd2 ...]
       or: -c --help-commands
       or: -c …
Run Code Online (Sandbox Code Playgroud)

python distutils pip

13
推荐指数
1
解决办法
5922
查看次数

如何使用 setuptools 和 pkg_ressources 获取安装目录

我正在处理P带有 setuptools 和 pkg_resources 的包,该包在安装后需要下载一些二进制文件并将它们放在专用目录 ( P/bin/) 中。

我正在尝试使用pkg_ressources.resource_filename来获取绝对目录路径。(为了与 virtualenv 一起工作)

在使用 安装期间python setup.py install, pkg_ressources.resource_filename 不会返回类似 的路径/home/user/tests/venv/lib/python3.4/site-package/P/bin/,而是返回实际模块的路径,例如/home/user/projects/P/P/bin/

这是一个问题,因为我需要安装目录(在 virtualenv 内),而不是我的个人项目目录(我开发模块的地方)。

如果我尝试通过 pypi,使用pip install module,返回的目录pkg_ressources.resource_filename是一个临时文件,例如/tmp/pip-build-xxxxxxx/P/bin/,这又不是应该放置二进制文件的地方。

这是我的 setup.py:

from setuptools import setup
import os

from setuptools.command.install import install as _install
from pkg_resources import resource_filename


def post_install():
    """Get the binaries online, and give them the execution permission"""
    package_dir_bin = resource_filename('P', 'bin') # should be /home/user/tests/venv/lib/python3.4/site-package/P/bin/ …
Run Code Online (Sandbox Code Playgroud)

python packaging setuptools pkg-resources

7
推荐指数
1
解决办法
3941
查看次数