我正在尝试向Python distutils添加安装后任务,如如何使用简单的安装后脚本扩展distutils中所述?.该任务应该在已安装的lib目录中执行Python脚本.此脚本生成安装包所需的其他Python模块.
我的第一次尝试如下:
from distutils.core import setup
from distutils.command.install import install
class post_install(install):
def run(self):
install.run(self)
from subprocess import call
call(['python', 'scriptname.py'],
cwd=self.install_lib + 'packagename')
setup(
...
cmdclass={'install': post_install},
)
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但据我所知,有两个不足之处:
PATH,则安装后脚本将使用不同的解释器执行,这可能会导致问题.distutils.cmd.Command.execute.我怎样才能改进我的解决方案?这样做有推荐的方法/最佳做法吗?如果可能的话,我想避免引入另一个依赖.
上次我不得不担心安装Python软件包是两年前与Enthought,NumPy和MayaVi2合作的.这种经历给了我挥之不去的噩梦,这些噩梦与在非标准位置($HOME/usr/local2.6/例如)中安装和更新Python包的古怪行为有关.
无论如何,我的工作让我回到安装各种Python包.该Cheeseshop上教程中提到的distutils和EasyInstall除了扩建!我很难找到一个比较这些(和其他)PyPi安装工具的地方,所以我希望进入StackOverflow社区: 每个安装工具的优点和缺点是什么?
我有一个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.它没有.
当覆盖cmdclass在setup()与我自己的类,install_requires似乎被忽略.一旦我注释掉那一行,就会安装这些软件包.
我知道例如在distutils中不支持install_requires(如果我记得很清楚),但它在setuptools中.然后cmdclass就不会有任何影响install_requires.
我用Google搜索了这个问题几个小时,在stackoverflow上找到了很多相关的答案,但不是针对这个特殊的问题.
把所有需要的包放到requirements.txt,一切都运行正常,但我想了解为什么会这样.谢谢!
来自Node.js + npm背景,尝试理解与Python包管理相关的所有事情真的很噩梦.经过几个小时的研究,我偶然发现了所有这些关键词:
有人可以帮我解读这些条款并将它们置于历史背景中吗?例如,"distutils是第一个包管理器,但它被Y取代,因为Z".
我非常喜欢Python(语言),但是对于过去几年一直在使用惊人的npm的人来说,包管理似乎是一个真正的噩梦.
关于这个问题的不同方面的许多帖子,但我没有看到一个将所有这些结合在一起的帖子.
首先是一个主观陈述:当我们移出解释器并开始解决部署问题时,我们在使用Python语言时遇到的简单性似乎就像是分段.如何在同一台机器上拥有多个版本的Python?应该在哪里安装包裹?Disutils vs. setuptools vs. pip等.在部署方面,似乎Python的Zen被滥用得非常糟糕.我对Windows上的"DLL地狱"体验感到怪异的回声.
专家们是否同意这些问题的某种程度的最佳实践?
你在同一台机器上运行多个版本的Python吗?你如何仍然相信,他们可以共存 - 和较新的版本不会破坏依赖于早期版本的其他进程的假设(由操作系统供应商提供的脚本,例如)?这样安全吗?virtualenv足够吗?
在本地文件系统上,Python环境的不同组件(包括第三方软件包)的位置的最佳选择是什么?对于可以依赖的许多不同版本的Unixy和Windows操作系统,位置之间是否存在严格或粗略的对应关系?
沼泽中最阴暗的角落 - 你使用什么安装工具(setuptools,distutils,pip等),并且它们适合您的选择:文件位置,Python虚拟环境,Python路径等.
这些听起来像是难题.我希望经验丰富的Pythonistas可能已经为这些挑战定义了一种规范的方法(或两种方法).任何"挂在一起"作为一个可以放心使用的系统的方法(感觉不像是单独的,不相关的工具)将是非常有帮助的.
我在python 2.7中开发自己的模块.它位于~/Development/.../myModule而不是/usr/lib/python2.7/dist-packages或/usr/lib/python2.7/site-packages.内部结构是:
/project-root-dir
/server
__init__.py
service.py
http.py
/client
__init__.py
client.py
Run Code Online (Sandbox Code Playgroud)
client/client.py包括PyCachedClient课程.我有进口问题:
project-root-dir$ python
Python 2.7.2+ (default, Jul 20 2012, 22:12:53)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from server import http
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "server/http.py", line 9, in <module>
from client import PyCachedClient
ImportError: cannot import name PyCachedClient
Run Code Online (Sandbox Code Playgroud)
我没有将PythonPath设置为包含my project-root-dir,因此当server.http尝试包含client.PyCachedClient时,它会尝试从相对路径加载它并失败.我的问题是 - 如何以良好的pythonic方式设置所有路径/设置?我知道export PYTHONPATH=... …
对于使用"setup.py"构建安装包的开发人员而言,这应该是一个非常常见的问题,应该先问过它,但我无法在任何地方找到合适的答案.
在setup.py中
from distutils.core import setup
setup(
....,
....,
data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])],
....,
....,
)
Run Code Online (Sandbox Code Playgroud)
sudo python setup.py安装的结果
running install
running build
running build_py
running build_scripts
running install_lib
running install_scripts
changing mode of /usr/local/bin/MyApp_trainer to 755
changing mode of /usr/local/bin/MyApp_reference_updater to 755
changing mode of /usr/local/bin/MyApp_predictor to 755
changing mode of /usr/local/bin/reference_updater to 755
running install_data
creating /usr/local/MyApp/CBV
copying MyApp/data/CBV/training.cbv -> /usr/local/MyApp/CBV
copying MyApp/data/CBV/test.cbv -> /usr/local/MyApp/CBV
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info
Run Code Online (Sandbox Code Playgroud)
从使用上述结果的观察,"/ usr/local"是"data_files"根目录.除了硬编码,是否有任何Python函数可以给我这个"data_files"根目录?
我需要在Ubuntu Linux 12.04上安装python的一些模块.我想要pygame和livewires,但我不知道如何安装它们.
我有livewires的py文件,它已被特别编辑(从我正在阅读的书中)我想安装它但我不知道如何,我也想安装pygame.
我最近开始学习Python,我对如何分发和安装软件包感到困惑.
我知道安装软件包的官方方式是distutils:你下载源tarball,解压缩它,然后运行:python setup.py install,然后模块将自动安装自己
我也知道带有帮助脚本的setuptoolseasy_install.它使用鸡蛋进行分发,根据我的理解,它构建在distutils之上并执行与上面相同的操作,并且它处理所需的任何依赖项,所有依赖于PyPi
然后还有pip,我仍然不确定它与其他人有什么不同.
最后,当我在Windows机器上时,许多软件包还通过Windows安装程序提供二进制构建,特别是那些需要编译C/Fortran代码的软件包,否则这将是在Windows上手动编译的噩梦(假设您有MSVC)或MinGW/Cygwin开发环境,所有必要的库设置..尽管如此,尝试自己建立numpy或scipy,你会明白!)
所以有人可以帮助我理解所有这些,并解释每种方法的差异,利弊.我想知道每个人如何跟踪包(Windows注册表,配置文件,...).特别是,您将如何管理所有第三方库(能够列出已安装的软件包,禁用/卸载等).
setup.py 有一个重大问题:
这导致了很多问题 - 无法安全地分析,从PyPI读取100k +包需要太多开销,源包无法自动转换为Debian和Fedora等本机系统格式.
那么,是否有任何替代方法可以使用静态数据格式(不是setup.py)来打包Python内容来描述和包装其内容?因此,a source package只是源检出的.zip文件,不需要魔术和构建步骤.
python ×10
distutils ×5
pip ×3
setuptools ×3
setup.py ×2
virtualenv ×2
buildout ×1
distribute ×1
easy-install ×1
install ×1
linux ×1
module ×1
package ×1
packages ×1
post-install ×1
pypi ×1
python-3.x ×1
ubuntu ×1