我有一个Python项目,它基本上是一组命令行脚本和一个帮助程序包.由于这些脚本有许多命令行选项,我决定为每个脚本创建一个手册页,并使用ronn(http://rtomayko.github.com/ronn/)在Markdown中编写手册并从中生成mdoc.
问题是:如何在基于distutils的项目中生成和安装手册页?
我提出了以下解决方案:创建一个简单的install.sh脚本,生成并安装手册页.我从重载的'install'命令调用此脚本并将指定的前缀传递给它...您可以在这里检查实际代码:http://github.com/novel/lc-tools.
我不太喜欢这个解决方案,因为简单的任务我必须添加一些hack来setup.py并实现一个shell脚本.此外,我使用$ {PREFIX}/share/man作为手册页路径,并且它对所有系统都不正确,例如FreeBSD似乎将第三方手册页安装到/ usr/local/man(即没有共享/).
有更优雅的方法吗?
我正在尝试创建一个python源包,但在创建文件的硬链接时失败了.
$ python setup.py sdist
running sdist
running check
reading manifest template 'MANIFEST.in'
writing manifest file 'MANIFEST'
making hard links in foo-0.1...
hard linking README.txt -> foo-0.1
error: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
我试过用sudo运行命令,但它会产生同样的错误.
这也会产生同样的错误:
ln foo bar
Run Code Online (Sandbox Code Playgroud)
我正在使用vbox运行ubuntu的虚拟实例,这可能是问题的来源.在创建源代码分发时,是否有使用硬链接的方法?
系统信息:
Ubuntu服务器11.04; VirtualBox 4.14; osx 10.6.6; python 2.7.1;
我是distutils的新手,我有一个问题,真的让我陷入困境.我正在编译一个需要扩展的包,所以我这样做了扩展:
a_module = Extension(
"amodule",
["initmodule.cpp"],
library_dirs=libdirs,
extra_objects = [
"unix/x86_64/lib/liba.so"
"unix/x86_64/lib/lib.so",
"unix/x86_64/lib/libc.so"],
)
Run Code Online (Sandbox Code Playgroud)
然后我运行安装方法:
setup(name="apackage", version="7.2",
package_dir = {'':instdir+'/a/b/python'},
packages=['apackage','package.tests'],
ext_modules=[hoc_module]
)
Run Code Online (Sandbox Code Playgroud)
包分发是正确的,我可以"python setup.py安装"罚款,但当我尝试导入我的包时,我收到一个错误
ImportError: liba.so.0: cannot open shared object file: No such file or directory
我意识到当我将liba.so.0的位置添加到我的LD_LIBRARY_PATH时,程序运行正常.不幸的是,我没有编写这些模块,也没有很好地理解编译.我一直试图解决这个问题几天无济于事.
更新:我尝试将liba.a,libb.a等文件传递给extra_objects,但这不起作用,生成以下错误:liba.a:无法读取符号:错误值collect2:ld返回1退出状态.我正在尝试做的是打包一个python模块,它需要编译一个库本身依赖于我需要以某种方式包含在包中的其他库.我怀疑我的问题非常类似于这个:http:/ /mail.python.org/pipermail/distutils-sig/2009-February/010960.html但那个问题没有得到解决,我想也许已经有两年了,已经找到了解决方案?
更新2:现在我通过这样做解决了这个问题:
data_files=[('/usr/local/lib', glob.glob('unix/x86_64/lib/*'))]
Run Code Online (Sandbox Code Playgroud)
也就是说,我正在将我需要的库复制到/ usr/local/lib中.我对这个解决方案并不是非常满意,尤其是因为它要求我的用户拥有root权限,并且因为这可能仍然无法使用Redhat发行版.所以,如果有人能提出比这个修复更好的建议,请告诉我.
python packaging software-distribution distutils distribution
今天快点:我正在学习Pythons distutils库的内外版本,我想在我的包中加入一个python扩展模块(.pyd).我当然知道推荐的方法是让distutils在创建包时编译扩展,但这是一个相当复杂的扩展,涵盖了许多源文件并引用了几个外部库,所以它需要一些重要的播放来获取所有内容工作正常.
与此同时,我有一个已知的工作版本的扩展来自Visual Studio,并希望在安装程序中使用它作为临时解决方案,让我专注于其他问题.但是,我无法将其指定为模块,因为那些显然必须具有明确的.py扩展名.我怎么能在setup.py中指出我想要包含一个预编译的扩展模块?
(Python 3.1,如果重要的话)
我正在构建一个使用PyQt的小应用程序,并且很高兴在setup.py中声明该依赖项.
然而,根据这个博客(谷歌首次点击pyqt setuptools)说它无法完成,而且这里的最后一段也没有尝试去做.
更新:
显而易见的install_requires = [ 'pyqt >= 0.7' ]是setup.py:
D:\3rd\BuildBotIcon\my-buildboticon\python>setup.py test
running test
install_dir .
Checking .pth file support in .
C:\Python26-32\pythonw.exe -E -c pass
Searching for pyqt>=4.7
Reading http://pypi.python.org/simple/pyqt/
Reading http://www.riverbankcomputing.com/software/pyqt/
Reading http://www.riverbankcomputing.com/software/pyqt/download
No local packages or download links found for pyqt>=4.7
error: Could not find suitable distribution for Requirement.parse('pyqt>=4.7')
Run Code Online (Sandbox Code Playgroud) Python有能力通过运行它的setup.py脚本来"伪装"一个包develop而不是install.这会修改python环境,因此可以从它的当前位置导入包(它不会被复制到site-package目录中).这允许开发其他包使用的包:源代码被修改到位,并且通过简单的更改可用于其余的python代码import.
一切正常,除了该setup.py develop命令创建一个.egg-info文件夹与元数据相同的文件夹setup.py.混合源代码和临时文件不是一个好主意 - 需要将此文件夹添加到从vcs和结束备份系统开始的多个工具的"忽略"列表中.
是否可以使用setup.py develop但.egg-info在其他地方创建目录,因此原始源代码不会受到临时目录和文件的污染?
对于一个项目,我构建了一个C库,并使用CMake隐藏了Python绑定(通过GObject内省).我还想使用distutils分发一些Python辅助模块.我可以用这个来构建和安装模块CMakeLists.txt
find_program(PYTHON "python")
if (PYTHON)
set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/module/__init__.py")
set(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/build")
configure_file(${SETUP_PY_IN} ${SETUP_PY})
add_custom_command(OUTPUT ${OUTPUT}
COMMAND ${PYTHON}
ARGS setup.py build
DEPENDS ${DEPS})
add_custom_target(target ALL DEPENDS ${OUTPUT})
install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")
endif()
Run Code Online (Sandbox Code Playgroud)
以下内容setup.py.in:
from distutils.core import setup, Extension
if __name__ == '__main__':
setup(name='foo',
version='${PACKAGE_VERSION}',
package_dir={ '': '${CMAKE_CURRENT_SOURCE_DIR}' },
packages=['module'])
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次运行时都会执行构建步骤make.我猜,问题与自定义命令的输出有关,该命令是目录而不是文件.现在,有没有办法告诉CMake python setup.py build只在setup.py.in其中一个来源发生变化时运行?
我正在开发一个包,它需要来自LAPACK Fortran库的dgtsv子例程的 Python绑定.目前,我正在分发Fortran源文件,dgtsv.f以及我的Python代码,并使用numpy.distutils它自动包装并将其编译成_gtsv.so可从Python调用的共享库.
这是我的setup.py文件目前的样子:
from numpy.distutils.core import setup, Extension, build_ext
import os
fortran_sources = ["dgtsv.f"]
gtsv = Extension(
name="pyfnnd._gtsv",
sources=[os.path.join("pyfnnd", "LAPACK", ff) for ff in fortran_sources],
extra_link_args=['-llapack']
)
setup(
name='pyfnnd',
py_modules=['_fnndeconv', 'demo', '_tridiag_solvers'],
cmdclass={'build_ext': build_ext.build_ext},
ext_modules=[gtsv],
)
Run Code Online (Sandbox Code Playgroud)
请注意,为了实际使用_gtsv.so,我仍然需要链接到预先存在的LAPACK共享库(extra_link_args=['-llapack']).由于这个库应该已经包含dgtsv子例程,在我看来,将函数包装在现有的共享库中更简洁,而不必分发实际的Fortran源.
但是,我从未遇到任何使用F2PY来包装作为共享库的一部分的函数而不仅仅是原始Fortran源代码的示例.这可能吗?
如何下载发行版,可能是 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选项,因为我不想排除源分发。我只是想避免执行他们的源代码。
我正在运行安装了 python 3.6、3.7 和 3.8 的 Ubuntu 20.04。
我正在尝试使用 'python3.7 -m pip install package' 在 3.6 和 3.7 版本上使用 pip 安装一些软件包,但是,我收到此错误:
ModuleNotFoundError: No module named 'distutils.util
Run Code Online (Sandbox Code Playgroud)
我已经安装python3-distutils并python3-distutils-extra安装了但pip 仅适用于 python 3.8。
distutils ×10
python ×9
setuptools ×3
pip ×2
ubuntu ×2
cmake ×1
distribution ×1
f2py ×1
lapack ×1
numpy ×1
packaging ×1
pypi ×1
pyqt ×1
python-3.x ×1
setup.py ×1
ubuntu-20.04 ×1
unix ×1
virtualbox ×1