我可以使用`pip`代替`easy_install`来解决`python setup.py install`的依赖关系吗?

162

python setup.py install 将自动使用 easy_install 安装 requires=[] 中列出的软件包。我如何让它使用 pip

3个回答

172

是的,你可以。你可以从tarball文件或者文件夹在网上或者你的电脑上安装一个包。例如:

从web的tarball文件安装

pip install https://pypi.python.org/packages/source/r/requests/requests-2.3.0.tar.gz

从本地tar包安装

wget https://pypi.python.org/packages/source/r/requests/requests-2.3.0.tar.gz
pip install requests-2.3.0.tar.gz

从本地文件夹安装

tar -zxvf requests-2.3.0.tar.gz
cd requests-2.3.0
pip install .

您可以删除requests-2.3.0文件夹。

从本地文件夹安装(可编辑模式)

pip install -e .

这将以可编辑模式安装软件包。 你对代码所做的任何更改都将立即应用于系统中。 如果您是软件包开发人员并想测试更改,则此功能很有用。 它还意味着您不能删除文件夹而不破坏安装。


14
如果您习惯使用“python setup.py install”来安装软件包,那么自然会问如何让“python setup.py install”用pip解决依赖关系,但这是错误的问题。解决方案是使用pip安装软件包,并停止使用“setup.py install”。 - joeforker
9
问题在于,如果你执行类似于python setup.py test的操作,你可能会被迫使用easy_install。 - TomDotTom
1
@TomDotTom,你有什么办法可以强制在运行“setup.py test”时使用pip吗? - Jan Sila
1
@joeforker,pip在幕后使用setup.py。如果我希望其他人能够使用pip安装我的软件包,我需要创建一个setup.py文件。 - cowlinator
如果你想证明这一点,请尝试 pip install -e git+https://github.com/octocat/Hello-World.git#egg=Hello-World。错误是 No such file or directory: 'c:\python\src\Hello-World\setup.py - cowlinator
@cowlinator,诀窍是始终使用pip执行setup.py而不要单独运行它。不过像https://flit.readthedocs.io/en/latest/这样的项目使得将所有内容放在pyproject.toml中并且完全没有setup.py也成为可能。 - joeforker

116

您可以首先通过python setup.py sdist来创建文件,然后使用pip install进行安装。您还可以使用pip install -e .来安装,这类似于python setup.py develop


16
提醒一下想尝试这个方法的人:注意pip install -e需要接收一个目录作为参数,而不是setup.py文件本身。我一开始没有注意到pip install -e .中的点号,导致了一些混淆 :) - Markus Amalthea Magnuson
3
谢谢。使用 pip uninstall 命令可以从可编辑模式卸载,例如:pip uninstall package-name - JuanPablo
2
可编辑的安装包可以通过常规的“pip uninstall <软件包名称>”卸载。 - joeforker
“pip install -e .” 真的是答案。它支持使用 “pip install -e .[extras]” 安装额外的依赖包,并且使得在实验室中分发私有 Python 包更加容易。 - Muhammad Yasirroni

7
如果你真的想使用 python setup.py install,你可以尝试如下方式:
from setuptools import setup, find_packages
from setuptools.command.install import install as InstallCommand


class Install(InstallCommand):
    """ Customized setuptools install command which uses pip. """

    def run(self, *args, **kwargs):
        import pip
        pip.main(['install', '.'])
        InstallCommand.run(self, *args, **kwargs)


setup(
    name='your_project',
    version='0.0.1a',
    cmdclass={
        'install': Install,
    },
    packages=find_packages(),
    install_requires=['simplejson']
)

1
谢谢,但是我在使用这个方法时遇到了递归回调的问题。当我使用“python setup.py install”命令时,它会调用Install.run再去调用pip install . ,而这个函数又会再次调用Install.run... - Lumen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接