我正在使用pip 1.4.1,尝试从本地路径安装包,例如:
pip install /path/to/my/local/package
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,这或多或少等同于运行python /path/to/my/local/package/setup.py install,但我想将一些额外的选项/参数传递给我的软件包的setup.py install.
我从pip文档中了解到,这可以通过--install-option选项实现,例如:
pip install --install-option="--some-option" /path/to/my/local/package
Run Code Online (Sandbox Code Playgroud)
来自python-virtualenv谷歌集团的这篇文章表明这是可能的.
我不明白的是如何从setup.py中获取传入的"--some-option".我试着看sys.argv,但无论我为"--install-option ="投入什么,sys.argv总是如此:
['-c', 'egg_info', '--egg-base', 'pip-egg-info']
Run Code Online (Sandbox Code Playgroud)
如何从pip install中获取作为"--install-option"传入的内容的值?
我们建立了一个依赖于其他库的库.但是有必要(例如,对于服务器批处理)和可选的依赖性(例如,对于具有GUI的客户端).
这样的事情是可能的:
pip install mylib.tar.gz # automatically downloads and installs with the minimal set of dependencies
pip install mylib.tar.gz --install-option="complete" # automatically installs with all dependencies
Run Code Online (Sandbox Code Playgroud)
我找到了extra_require旗帜,但我怎么能告诉pip他们使用它们?该setup.py如下所示:
from setuptools import setup
# ...
# Hard library depencencies:
requires = [
"numpy>=1.4.1",
"scipy>=0.7.2",
"traits>=3.4.0"
]
# Soft library dependencies:
recommended = {
"mpl": ["matplotlib>=0.99.3"],
"bn": ["bottleneck>=0.6"]
}
# ...
# Installer parameters:
setup(
name = "mylib",
#...
install_requires = requires,
extras_require = recommended
)
Run Code Online (Sandbox Code Playgroud) Python的setuptool有两种方法可以将命令行脚本添加到Python包中:script和entry_point.
本教程概述了以下方法:
scripts将Python脚本(funniest-joke)添加到包树,并将其路径添加到setup.py:
setup(
...
scripts=['bin/funniest-joke'],
...
)
Run Code Online (Sandbox Code Playgroud)
将Python脚本(funniest-joke)添加到包树.添加一个main()函数,并添加command_line.py运行最有趣的子模块main():
command_line.py:import funniest
def main():
print funniest.joke()
Run Code Online (Sandbox Code Playgroud)
setup.pysetup(
...
entry_points = {
'console_scripts': ['funniest-joke=funniest.command_line:main'],
}
...
)
Run Code Online (Sandbox Code Playgroud)
每种方法有哪些优缺点?
我有一个python具有固定布局的应用程序,我无法更改.我想用setuptools把它包起来,比如写一个setup.py脚本.
使用官方文档,我能够编写第一个模板.但是,有问题的应用程序使用了许多未明确包含任何包的其他数据文件.这是一个示例源树:
somepackage
__init__.py
something.py
data.txt
additionalstuff
moredata.txt
INFO.txt
Run Code Online (Sandbox Code Playgroud)
这是麻烦:代码something.py 读取文件moredata.txt和INFO.txt.对于前者,我可以通过添加一个空additionalstuff/__init__.py文件来提升additionalstuff一个包并让它被选中来解决这个问题setuptools.但我怎么可能加入INFO.txt我的.egg?
提出的解决方案使用了类似的东西
package_data = { '' : ['moredata.txt','INFO.txt']}
Run Code Online (Sandbox Code Playgroud)
不为我工作,因为文件moredata和INFO.txt不属于一个包,而是单独的文件夹,这只是模块作为一个整体的一部分,而不是任何个人软件包的一部分.如上所述,这可以moredata.txt通过添加__init__.py文件来修复additionpythonalstuff,从而将其提升到包.但是,这不是一个优雅的解决方案,并且根本不起作用INFO.txt,它位于顶级目录中.
根据接受的答案,这是解决方案
这是setup.py:
from setuptools import setup, find_packages
setup(
name='mytest',
version='1.0.0',
description='A sample Python project',
author='Test',
zip_safe=False,
author_email='test@test.com',
keywords='test',
packages=find_packages(),
package_data={'': ['INFO.txt', 'moredata.txt'],
'somepackage':['data.txt']},
data_files=[('.',['INFO.txt']),
('additionalstuff',['additionalstuff/moredata.txt'])],
include_package_data=True, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个链接C++库的Python扩展,我正在使用cmake来帮助构建过程.这意味着,现在,我知道如何捆绑它的唯一方法,我必须先用cmake编译它们才能运行setup.py bdist_wheel.肯定有更好的办法.
我想知道是否有可能(或任何人尝试过)调用CMake作为setup.py ext_modules构建过程的一部分?我猜有一种方法来创建一个东西的子类但我不知道在哪里看.
我正在使用CMake,因为它为我提供了更多的控制,可以根据我的需要构建具有复杂构建步骤的c和c ++库扩展.另外,我可以使用findPythonLibs.cmake中的PYTHON_ADD_MODULE()命令直接使用cmake构建Python扩展.我只希望这一步都是一步.
我正在尝试创建一个 setup.py 文件,其中 find_packages() 递归地查找包。在这个例子中,foo, bar, 和baz都是我想要安装并在 python 路径上可用的模块。例如,我希望能够做到import foo, bar, baz. 该bar-pack和foo-pack只是常规的非蟒目录将包含各种支持文件/显示目录(如测试,自述等,具体到相应的模块)。
??? bar-pack
? ??? bar
? ??? __init__.py
??? baz
? ??? __init__.py
??? foo-pack
? ??? foo
? ??? __init__.py
??? setup.py
Run Code Online (Sandbox Code Playgroud)
然后说setup.py如下:
from setuptools import setup, find_packages
setup(
name="mypackage",
version="0.1",
packages=find_packages(),
)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行python setup.py installor 时python setup.py sdist,只有baz目录被识别和打包。
我可以进一步简化它,并运行以下命令,但同样,只有baz被识别。
python -c "from setuptools import setup, find_packages; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的包从 迁移setup.py到pyproject.toml,但我不确定如何以与以前相同的方式进行动态版本控制。目前,当构建用于开发时,我可以使用环境变量传递开发版本。
该文件setup.py看起来类似于:
import os
from setuptools import setup
import my_package
if __name__ == "__main__":
dev_version = os.environ.get("DEV_VERSION")
version = dev_version if dev_version else f"{my_package.__version__}"
setup(
name="my_package",
version=version,
...
)
Run Code Online (Sandbox Code Playgroud)
使用文件时有没有办法做类似的事情pyproject.toml?
如何下载发行版,可能是 sdist,而不可能执行setup.py文件(可能包含恶意代码)?
我不想递归获取依赖项,只为指定的发行版下载一个文件。尝试不起作用:
pip download --no-deps mydist
Run Code Online (Sandbox Code Playgroud)
这是一个可重现的示例,演示了setup.py在上述情况下仍然执行:
pip download --no-deps mydist
Run Code Online (Sandbox Code Playgroud)
我不能使用--no-binary选项,因为我不想排除源分发。我只是想避免执行他们的源代码。
我看到很多错误和建议 Parent module '' not loaded, ...
我没有看到任何关于“开箱即用”的 django 3.5。
$ mkvirtualenv foobar -p /usr/bin/python3
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/isaac/.virtualenvs/foobar/bin/python3
Also creating executable in /home/isaac/.virtualenvs/foobar/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
[foobar] $ pip install django
Collecting django
Using cached Django-2.2.15-py3-none-any.whl (7.5 MB)
Collecting pytz
Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Collecting sqlparse>=0.2.2
Using cached sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
Installing collected packages: pytz, sqlparse, django
Successfully installed django-2.2.15 pytz-2020.1 sqlparse-0.3.1
[foobar] $ python
Python 3.5.3 …Run Code Online (Sandbox Code Playgroud) Pip 支持该pyproject.toml文件,但到目前为止,新模式的所有实际使用都需要一个 3rd 方工具来自动生成这些文件(例如,诗歌和 pip)。不像setup.py已经是人类可写的,pyproject.toml不是(还)。
[build-system]
requires = [
"setuptools >= 40.9.0",
"wheel",
]
build-backend = "setuptools.build_meta"
Run Code Online (Sandbox Code Playgroud)
但是,此文件不包含包依赖项(如 PEP 621 中所述)。Pip 确实支持使用安装包,pyproject.toml但 pep 没有指定如何pyproject.toml为官方构建系统编写包依赖项setuptools。
我如何编写包依赖项pyproject.toml?
相关的 StackOverflow 问题:
这个问题要求一种自动生成的方法pyproject.toml,我的问题有所不同,因为我要求使用人工编写的pyproject.toml.
setuptools python-packaging python-poetry pyproject.toml pep517