我刚刚将我的软件包的新版本上传到PyPi(1.2.1.0-r4):我可以下载egg文件并使用easy_install进行安装,版本检查正确.但是当我尝试使用pip进行安装时,它会安装版本1.1.0.0.即使我明确指定要使用的版本pip install -Iv tome==1.2.1.0-r4,我也会得到这样的信息:Requested tome==1.2.1.0-r4, but installing version 1.1.0.0但我不明白为什么.
我仔细检查parse_version并确认1.2.1上的版本字符串大于1.1.0上的版本字符串,如下所示:
>>> from pkg_resources import parse_version as pv
>>> pv('1.1.0.0') < pv('1.2.1.0-r4')
True
>>>
Run Code Online (Sandbox Code Playgroud)
所以任何想法为什么选择安装1.1.0而不是?
包含静态文件是不可能的!我尝试了我在教程和文档中找到的所有内容,但都是徒劳的......
我想要包含./static/data.txt,还有我的代码:
# setup.py
import os,glob
from setuptools import setup,find_packages
setup(
name = "PotatoProject",
version = "0.1.1",
author = "Master Splinter",
author_email = "splinter@initech.com",
description = ("The potatoproject!"),
url = 'http://www.google.com',
license = "BSD",
# adding packages
packages=find_packages('src'),
package_dir = {'':'src'},
# trying to add files...
include_package_data = True,
package_data = {
'': ['*.txt'],
'': ['static/*.txt'],
'static': ['*.txt'],
},
scripts=['src/startPotato'],
classifiers=[
"Development Status :: 3 - Alpha",
"Topic :: Utilities",
"License :: OSI Approved :: BSD License",
],
)
Run Code Online (Sandbox Code Playgroud)
文件系统: …
我正在setup.py为项目创建一个文件,该文件依赖于私有GitHub存储库.该文件的相关部分如下所示:
from setuptools import setup
setup(name='my_project',
...,
install_requires=[
'public_package',
'other_public_package',
'private_repo_1',
'private_repo_2',
],
dependency_links=[
'https://github.com/my_account/private_repo_1/master/tarball/',
'https://github.com/my_account/private_repo_2/master/tarball/',
],
...,
)
Run Code Online (Sandbox Code Playgroud)
我使用的setuptools,而不是distutils因为后者不支持install_requires和dependency_links参数每这一答案.
上面的安装文件无法访问带有404错误的私有存储库 - 这是预期的,因为GitHub会将404返回到未经授权的私有存储库请求.但是,我无法弄清楚如何进行setuptools身份验证.
以下是我尝试过的一些事情:
使用git+ssh://,而不是https://在dependency_links为我想如果安装与回购pip.这失败是因为setuptools无法识别此协议("未知的url类型:git + ssh"),尽管分发文档说它应该.同上git+https和git+http.
https://<username>:<password>@github.com/...- 仍然得到404.(此方法不能与命令行一起使用curl或wget从命令行使用 - 尽管curl -u <username> <repo_url> -O <output_file_name>确实有效.)
将setuptools(0.9.7)和virtualenv(1.10)升级到最新版本.也尝试安装分发虽然这个概述说它被合并回setuptools.无论哪种方式,没有骰子.
目前我只是setup.py打印出一个警告,必须单独下载私人回购.这显然不太理想.我觉得有一些显而易见的东西让我失踪,但却想不到它会是什么.:)
这里没有答案的重复问题.
我正在尝试将基于setuptools的项目从传统配置迁移setup.py到现代pyproject.toml配置。
同时,我希望保持基于 的完善工作流程pip-compile,即 arequirements.in被编译为 a requirements.txt(当然对于最终用户/非库项目)。由于完全透明,这具有重要的好处:
因此,我不想pyproject.toml通过dependencies = []列表直接在内部维护依赖项,而是在pip-compiled托管的外部维护requirements.txt。
这让我想知道:有没有一种方法可以requirements.txt在pyproject.toml配置中引用文件,而不必回退到setup.py脚本?
使用distutils,setuptools等,包版本指定在setup.py:
# file: setup.py
...
setup(
name='foobar',
version='1.0.0',
# other attributes
)
Run Code Online (Sandbox Code Playgroud)
我希望能够从包中访问相同的版本号:
>>> import foobar
>>> foobar.__version__
'1.0.0'
Run Code Online (Sandbox Code Playgroud)
我可以添加__version__ = '1.0.0'到我的包的__init__.py,但我还想在我的包中包含其他导入以创建包的简化接口:
# file: __init__.py
from foobar import foo
from foobar.bar import Bar
__version__ = '1.0.0'
Run Code Online (Sandbox Code Playgroud)
和
# file: setup.py
from foobar import __version__
...
setup(
name='foobar',
version=__version__,
# other attributes
)
Run Code Online (Sandbox Code Playgroud)
但是,foobar如果导入其他尚未安装的软件包,这些额外的导入可能会导致安装失败.使用setup.py和软件包共享软件包版本的正确方法是什么?
我在setup.py中有dependency_links:
...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...
Run Code Online (Sandbox Code Playgroud)
但它不起作用.但是install_requires工作正常.也许有另一种方法来设置setup.py所需的git repo?
我正在尝试为我的包编写setup.py.我的包需要指定对另一个git仓库的依赖.
这是我到目前为止:
from setuptools import setup, find_packages
setup(
name='abc',
packages=find_packages(),
url='https://github.abc.com/abc/myabc',
description='This is a description for abc',
long_description=open('README.md').read(),
install_requires=[
"requests==2.7.0",
"SomePrivateLib>=0.1.0",
],
dependency_links = [
"git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
],
include_package_data=True,
)
Run Code Online (Sandbox Code Playgroud)
当我跑:
pip install -e https://github.abc.com/abc/myabc.git#egg=analyse
Run Code Online (Sandbox Code Playgroud)
我明白了
找不到满足要求的版本SomePrivateLib> = 0.1.0(来自analyze)(来自版本:)未找到SomePrivateLib的匹配分布> = 0.1.0(来自analyze)
我究竟做错了什么 ?
我的目标是分发一个Python包,其中包含其他几个广泛使用的Python包作为依赖项.我的包依赖于编写良好的Pypi索引包,如pandas,scipy和numpy,并在setup.py中指定需要某些版本或更高版本,例如"numpy> = 1.5".
我发现,对于那些不是 Python打包专家的Unix精明用户(即使他们知道如何编写Python)来安装像我这样的软件包,即使在使用易于使用的软件包管理器时,我也感到非常沮丧和几乎不可能.我想知道是否有一个替代这个痛苦的过程,有人可以提供,或者如果我的经验只是反映了Python包装和分发的当前状态非常困难.
假设用户将您的包下载到他们的系统上.大多数人会试图"天真地"安装它,使用类似的东西:
$ python setup.py install
Run Code Online (Sandbox Code Playgroud)
因为如果你有关于安装Python软件包的google说明,通常会出现这种情况.这对绝大多数用户来说都是失败的,因为大多数用户的Unix/Linux服务器上没有超级用户访问权限.通过更多搜索,他们将发现"--prefix"选项并尝试:
$ python setup.py install --prefix=/some/local/dir
Run Code Online (Sandbox Code Playgroud)
由于用户不知道Python包装的复杂性,他们会选择一个任意目录作为参数--prefix,例如"~/software/mypackage/".它不会是所有其他Python包所在的干净策划目录,因为大多数用户都不知道这些细节.如果他们安装另一个包"myotherpackage",他们可能会通过它"~/software/myotherpackage",你可以想象这将导致令人沮丧的黑客攻击PYTHONPATH和其他并发症.
继续安装过程,一旦用户尝试使用该包,调用"setup.py install"with "--prefix"也将失败,即使它似乎已正确安装,因为其中一个依赖项可能会丢失(例如pandas,scipy或numpy)和一个包经理没有使用.他们会尝试单独安装这些软件包.即使成功,包也将不可避免地PYTHONPATH归因于给出的非标准目录,"--prefix"并且患者用户将涉及修改它们PYTHONPATH以使得依赖性可见.
在这个阶段,Python精明的朋友可能会告诉用户他们应该使用像"easy_install"主流管理器这样的软件包管理器来安装软件并且需要处理依赖项.安装后"easy_install",这可能很难,他们会尝试:
$ easy_install setup.py
Run Code Online (Sandbox Code Playgroud)
这也将失败,因为用户通常无权在生产Unix服务器上全局安装软件.通过阅读更多,他们将了解该"--user"选项,并尝试:
$ easy_install setup.py --user
Run Code Online (Sandbox Code Playgroud)
他们会得到错误:
usage: easy_install [options] requirement_or_url ...
or: easy_install --help
error: option --user not recognized
Run Code Online (Sandbox Code Playgroud)
他们将非常困惑为什么他们easy_install没有--user选项,因为网上有明确的网页描述选项.他们可能会尝试将其升级easy_install到最新版本并发现它仍然失败.
如果他们继续并咨询Python包装专家,他们会发现有两个版本,两个版本easy_install都被命名为" …
我不确定我是正确地组织我的包结构还是在setup.py中使用正确的选项,因为我在尝试运行单元测试时遇到错误.
我有这样的结构:
/project
/bin
/src
/pkgname
__init__.py
module1.py
module2.py
/tests
__init__.py
test1.py
test2.py
Run Code Online (Sandbox Code Playgroud)
我的setup.py看起来像这样:
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(version='0.1',
description='Trend following library',
author='Nate Reed',
author_email='nate@natereed.com',
packages=find_packages(),
install_requires=['numpy'],
test_suite="tests",
)
Run Code Online (Sandbox Code Playgroud)
当我运行'python setup.py test'时,我得到:
nate@nate-desktop:~/PycharmProjects/trendfollowing$ sudo python setup.py test
running test
running egg_info
writing requirements to UNKNOWN.egg-info/requires.txt
writing UNKNOWN.egg-info/PKG-INFO
writing top-level names to UNKNOWN.egg-info/top_level.txt
writing dependency_links to UNKNOWN.egg-info/dependency_links.txt
reading manifest file 'UNKNOWN.egg-info/SOURCES.txt'
writing manifest file 'UNKNOWN.egg-info/SOURCES.txt'
running build_ext
Traceback (most recent call last):
File "setup.py", line 11, in <module> …Run Code Online (Sandbox Code Playgroud) 如何停止setup.py将包装作为鸡蛋?或者甚至更好,我如何easy_install安装包作为egg?
sudo python setup.py安装
原因是对于格式化的软件包PyDev非常挑剔egg...我现在感兴趣的软件包是boto.
更新:我找到了蛮力的方式:
sudo easy_install -m boto
cd path/to/boto-xyz.egg
sudo mv boto ..
sudo rm -rf boto-xyz.egg
Run Code Online (Sandbox Code Playgroud) python ×10
setuptools ×10
pip ×4
distutils ×2
easy-install ×2
distribute ×1
django ×1
git ×1
github ×1
package ×1
packaging ×1
pydev ×1
testing ×1