是否可以将安装后的Python脚本文件指定为setuptools setup.py文件的一部分,以便用户可以运行该命令:
python setup.py install
Run Code Online (Sandbox Code Playgroud)
在本地项目文件存档,或
pip install <name>
Run Code Online (Sandbox Code Playgroud)
对于PyPI项目,脚本将在标准setuptools安装完成后运行?我希望执行可以在单个Python脚本文件中编码的安装后任务(例如,向用户提供自定义安装后消息,从其他远程源存储库中提取其他数据文件).
几年前我遇到了这个回答这个主题的答案,听起来好像当时的共识是你需要创建一个install子命令.如果仍然如此,那么有人可以提供一个如何执行此操作的示例,以便用户无需输入第二个命令来运行脚本吗?
我有一个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,一切都运行正常,但我想了解为什么会这样.谢谢!
我正在尝试打包PyQt的版本(我没有为我需要的配置提供安装程序),但我找不到任何有效的打包配置.但问题并不是PyQt特有的.
问题:为了使模块工作,它需要python的PREFIX目录中的文件.我知道这可能是不好的形式,但在我的情况下需要有一个qt.conf文件,除了使文件可用之外,我没有什么可以做的.我需要能够运行安装后脚本来创建包含已安装的PyQt路径的文件.或者至少这似乎是最好的解决方案.
我看过的选项:
我可以使用python setup.py install并覆盖setuptools.command.install类.但是,这在手动运行setup.py时有效,并且需要解压缩bdist并在包文件夹中具有cmd提示符.它不适用于bdist_wininst,bdist_msi或bdist_wheel,它们更便于安装(包装点).可能,但不是一个很好的解决方案.
bdist_wheel似乎是一个不错的选择,但它不会在安装后运行任何东西,只会将文件放在特定的文件夹中,不包括PREFIX.
bdist_wininst支持安装后脚本(在创建包时通过--install-script开关),但不能与virtualenv一起使用.有一个stackoverflow答案建议运行easy_install或wheel convert,但这些选项只解包,他们不会运行安装脚本.否则,您必须更改注册表,这不是一个可接受的解决方案.
我错过了什么?有可行的选择吗?
使用from setuptools.command.install import install,如果我运行,我可以轻松运行自定义安装后脚本python setup.py install.这是相当微不足道的.
目前,该脚本除了打印一些文本之外什么都不做,但我希望它能够处理安装新软件包时需要进行的系统更改 - 例如,备份软件包正在使用的数据库.
我想为我的包生成一个Python轮,然后将其复制并安装在一组部署机器上.但是,我的自定义安装脚本不再在部署计算机上运行.
我究竟做错了什么?这甚至可能吗?
这与这个问题有些相关.假设我有一个我想通过rpm部署的软件包,因为我需要在安装后进行一些文件复制,并且我有一些我想要声明的非python依赖项.但是我们还说我有一些python依赖项,可以在PyPI中轻松使用.好像我只是打包成一个鸡蛋,然后解压缩python setup.py install会自动处理我的python依赖关系,代价是丢失任何安装后功能和非python依赖项.
有没有推荐的方法呢?我想我可以在预安装脚本中指定它,但后来我进入信息重复,并没有真正使用setuptools的任何东西.
(我目前的设置是传递install_requires = ['dependency_name']到setup,它适用于python setup.py bdist_egg和unzip my_package.egg; python my_package/setup.py install,但不python setup.py bdist_rpm --post-install post-install.sh和rpm --install my_package.rpm.)
假设我有一个包,它在代码的某处调用一个可执行文件(例如第三方 c/java 程序)。让我们进一步假设,应用程序足够小/微不足道,可以与包捆绑在一起。例如单个可执行文件 ( cfoo)。
我可以继续,并将文件放入以下结构中:
.
|-- foo
| |-- __init__.py
| |-- __init__.pyc
| |-- core.py
| |-- corebin
| | `-- cfoo
| `-- foomain.py
`-- setup.py
Run Code Online (Sandbox Code Playgroud)
并准备一个setup.py如下:
from setuptools import setup
setup(
name='foo',
version='1.0',
packages=['foo'],
scripts=['foo/foomain.py'],
package_data={'foo': ['corebin/*']},
zip_safe=False
)
Run Code Online (Sandbox Code Playgroud)
这将使我能够正确安装软件包。后来,在包代码中,我可以这样做:
from subprocess import call
import pkg_resources as res
def main():
fn = res.resource_filename('foo', 'corebin/cfoo')
print "Resource located at:", fn
call([fn])
Run Code Online (Sandbox Code Playgroud)
不幸的是,可执行文件将在没有设置可执行标志的情况下安装。即使原始文件已设置。chmod在setup.py脚本末尾添加调用并不容易,因为首先需要找出正确的安装路径。我尝试过,resource_filename但返回了本地文件(如“预安装”)。
如何解决这个问题?还 …
python ×6
setuptools ×5
distutils ×2
setup.py ×2
distribute ×1
packaging ×1
pip ×1
pypi ×1
python-wheel ×1
rpm ×1
virtualenv ×1