如何在 PyPi setup.py 文件中包含 .exe、apt-get 和 brew 安装文件 [英] How to include .exe, apt-get and brew install files on a PyPi setup.py file
问题描述
我正在编写一个 setup.py 文件来使用 PyPi 包安装一个开源项目.问题是,这个项目还需要安装外部应用程序(ghostscript
、imagemagick
和 tesseract
).这些应用有不同的安装方式,具体取决于平台(win、linux 或 mac).
I'm writing a setup.py file to install an OpenSource project using PyPi package. The thing is, this project requires to install as well outside apps (ghostscript
, imagemagick
, and tesseract
). These apps have different ways to install depending on the platform (win, linux, or mac).
我写了一个文件,当我执行 python setup.py install
时安装所有它.问题是当我在 PyPi
上加载 tar
和 whl
文件并执行 pip install Gap-ML
它只是安装模块,而不是安装这些应用程序.
I wrote a file that when I execute python setup.py install
install all of it. The problem is when I load the tar
and whl
files on PyPi
and I execute pip install Gap-ML
it is just installing the modules but it is not installing these apps.
这里是 setup.py 上的代码:
Here the code on setup.py:
""" setup Gap-ML
Copyright, 2018(c), Andrew Ferlitsch
Autor: David Molina @virtualdvid
"""
from setuptools import setup, find_packages
from distutils.command.install import install
import os, sys, platform
import requests
##Install custom apps Ghostscript, Imagemagick, and Tesseract
def install_apps(app_name, app_path, url):
"""
Install custom apps
:param app_name: name of the app to install
:param app_path: path on windows where the app should be installed
:param url: url where the .exe file is located
"""
#extract the app_name.exe from the url
app = url.split('/')[-1]
#verify if the software is already installed on windows
if os.path.exists(app_path):
print('{} already installed'.format(app_name))
else:
print('Download has started')
#warning message to specify the correct path where to install the app
if platform.architecture()[0] == '64bit':
print('Please verify C:\\Program Files\\ is part of the path to install the app')
else:
print('Please verify C:\\Program Files (x86)\\ is part of the path to install the app')
#download, install, and delete the app_name.exe
r = requests.get(url, allow_redirects=True)
open(app, 'wb').write(r.content)
os.system(os.path.join(os.getcwd(),app))
os.remove(app)
#verify pythonpath to execute the apps from terminal
if app_path not in sys.path:
sys.path.append(app_path)
print('{} has been installed successful'.format(app_name))
def main():
#verify Operative System
if sys.platform.startswith('win'):
windows={'64bit':{1:{'app_name':'Ghostscript',
'app_path':'C:\\Program Files\\gs\\gs9.23\\bin\\',
'url':'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs923/gs923w64.exe'},
2:{'app_name':'Imagemagick',
'app_path':'C:\\Program Files\\ImageMagick-7.0.8-Q8',
'url':'https://www.imagemagick.org/download/binaries/ImageMagick-7.0.8-9-Q8-x64-static.exe'},
3:{'app_name':'Tesseract',
'app_path':'C:\\Program Files\\Tesseract-OCR',
'url':'https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v4.0.0-beta.1.20180608.exe'}
},
'32bit':{1:{'app_name':'Ghostscript',
'app_path':'C:\\Program Files (x86)\\gs\\gs9.23\\bin\\',
'url':'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs923/gs923w32.exe'},
2:{'app_name':'Imagemagick',
'app_path':'C:\\Program Files (x86)\\ImageMagick-7.0.8-Q8',
'url':'https://www.imagemagick.org/download/binaries/ImageMagick-7.0.8-9-Q8-x86-static.exe'},
3:{'app_name':'Tesseract',
'app_path':'C:\\Program Files (x86)\\Tesseract-OCR',
'url':'https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w32-setup-v4.0.0-beta.1.20180608.exe'}
},
'common':{1:{'app_name':'Ghostscript',
'url':'https://www.ghostscript.com/download/gsdnld.html'},
2:{'app_name':'Imagemagick',
'url':'https://www.imagemagick.org/script/download.php'},
3:{'app_name':'Tesseract',
'url':'https://github.com/UB-Mannheim/tesseract/wiki'}
}
}
OS=platform.architecture()[0]
for i in range(1,4):
try:
app_name = windows[OS][i]['app_name']
app_path = windows[OS][i]['app_path']
url = windows[OS][i]['url']
install_apps(app_name, app_path, url)
except:
app_name = windows['common'][i]['app_name']
url = windows['common'][i]['url']
print('{} Download files on {}'.format(app_name, url))
elif sys.platform.startswith('linux'):
#install Ghostscript:
os.system('sudo apt-get update && sudo apt-get install ghostscript')
#install ImageMagick:
os.system('sudo apt-get install imagemagick')
#install Tesseract:
os.system('sudo apt-get install tesseract-ocr && sudo apt-get install tesseract-ocr-eng')
elif sys.platform.startswith('darwin'):
os.system('/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"')
os.system('brew update')
os.system('brew install ghostscript imagemagick tesseract')
##Setup config
#additional class to execute main() for custom install apps
class CustomInstall(install):
def run(self):
install.run(self)
main()
#setup components
with open('README.md') as f:
long_description = f.read()
install_requires=[
'bs4',
'numpy',
'h5py',
'imutils',
'unidecode',
'nltk',
'requests',
'opencv-python',
'pillow',
'pyaspeller']
tests_require=[
'pytest',
'pytest-cov']
package_data={'gapml': ['org-os/*', 'plan/*', 'tools/*', 'train/*']}
project_urls={"Documentation": "https://andrewferlitsch.github.io/Gap/",
"Source Code": "https://github.com/andrewferlitsch/Gap"}
#https://pypi.org/pypi?%3Aaction=list_classifiers
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Healthcare Industry',
'Topic :: Text Processing',
'License :: OSI Approved :: Apache Software License',
'Operating System :: Microsoft :: Windows',
'Operating System :: MacOS',
'Operating System :: POSIX :: Linux',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.0',
'Programming Language :: Python :: 3.1',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7']
setup(
name='Gap-ML',
version='0.9.2',
description='NLP and CV Data Engineering Framework',
author='Andrew Ferlitsch',
author_email='aferlitsch@gmail.com',
license='Apache 2.0',
url='https://github.com/andrewferlitsch/Gap',
project_urls=project_urls,
long_description=long_description,
packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
install_requires=install_requires,
tests_require=tests_require,
package_data=package_data,
cmdclass={'install': CustomInstall},
classifiers=classifiers
)
如何从 PyPi
安装这些应用程序?我错过了什么?:/
How can I install these apps from PyPi
? What am I missing? :/
我们是一个面向机器学习
和自然语言处理
的年轻开源项目.如果有人想贡献,欢迎加入我们.:)
We are a young OpenSource Project for Machine Learning
and Natural Language Processing
. If someone want to contribute you are welcome to join us. :)
任何帮助将不胜感激,谢谢!
Any help will be apreciatte, Thanks!
推荐答案
因为你上传了一个轮子 (.whl) 文件到 PyPI,pip install ...
将从那个轮子安装,然后轮子不要以任何方式支持你正在尝试做的事情.从理论上讲,您只需将 .tar.gz
或 .zip
文件上传到 PyPI 即可使其工作",以便从中安装 pip,但这需要用户总是以管理员权限安装你的包,这是一个坏主意,违背了推荐的做法并且并不总是有效(例如,用户将无法在 virtualenv 中安装你的包).正确的做法是不要在 setup.py
中安装任何系统包;相反,请在项目的自述文件中记录所需的包以及如何安装它们.
Because you uploaded a wheel (.whl) file to PyPI, pip install ...
will install from that wheel, and wheels do not in any way support what you're trying to do. In theory, you could get this to "work" by only uploading a .tar.gz
or .zip
file to PyPI so that pip installs from that, but this would require the user to always install your package with administrator privileges, which is a bad idea that goes against recommended practice and doesn't always work (e.g., users would be unable to install your package in a virtualenv). The proper thing to do is to not install any system packages in your setup.py
; instead, document the needed packages and how to install them in your project's README.
这篇关于如何在 PyPi setup.py 文件中包含 .exe、apt-get 和 brew 安装文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!