convert pip wheel -> conda package
whl zip
conda tgz
conversion:
from fastai2.torch_basics import *
import zipfile,tarfile
from email.parser import Parser
from wheel import wheelfile
from conda.gateways.disk.read import read_python_record
path = Path('~/git/spacy_conda/cymem').expanduser()
pkg = path/'pkg/cymem-2.0.2-py37_0.tar.bz2'
whl = path/'whl/cymem-2.0.2-cp37-cp37m-manylinux1_x86_64.whl'
pkg.exists(),whl.exists()
(True, True)
zpkg = tarfile.open(pkg,"r:bz2")
lpkg = zpkg.getmembers()
[(i,o.name) for i,o in enumerate(lpkg) if o.name.startswith('info/')]
[(0, 'info/hash_input.json'), (1, 'info/index.json'), (2, 'info/files'), (3, 'info/paths.json'), (4, 'info/about.json'), (5, 'info/git')]
f = (zpkg.extractfile('info/about.json').read().decode())
print(f)
fn.name
{
"channels": [
"pytorch",
"fastai",
"defaults"
],
"conda_build_version": "3.18.8",
"conda_private": false,
"conda_version": "4.7.12",
"env_vars": {
"CIO_TEST": "<not set>"
},
"extra": {
"copy_test_source_files": true,
"final": true
},
"home": "https://github.com/explosion/cymem",
"identifiers": [],
"keywords": [],
"license": "MIT",
"root_pkgs": [
"partd 1.0.0 py_0",
"nltk 3.4.5 py37_0",
"beautifulsoup4 4.8.0 py37_0",
"sphinxcontrib-htmlhelp 1.0.2 py_0",
"wheel 0.33.6 py37_0",
"mock 3.0.5 py37_0",
"numpy-base 1.17.2 py37hde5b4d6_0",
"qtpy 1.9.0 py_0",
"mistune 0.8.4 py37h7b6447c_0",
"bitarray 1.0.1 py37h7b6447c_0",
"libtiff 4.0.10 h2733197_2",
"mpc 1.1.0 h10f8cd9_1",
"cryptography 2.7 py37h1ba5d50_0",
"pytest-astropy 0.5.0 py37_0",
"krb5 1.16.1 h173b8e3_7",
"libssh2 1.8.2 h1ba5d50_0",
"anaconda custom py37_1",
"ipython 7.8.0 py37h39e3cac_0",
"zlib 1.2.11 h7b6447c_3",
"pytest 5.1.2 py37_0",
"clyent 1.2.2 py37_1",
"werkzeug 0.16.0 py_0",
"libarchive 3.3.3 h5d8350f_5",
"pep8 1.7.1 py37_0",
"sqlalchemy 1.3.8 py37h7b6447c_0",
"cffi 1.12.3 py37h2e261b9_0",
"pycurl 7.43.0.3 py37h1ba5d50_0",
"cloudpickle 1.2.2 py_0",
"sphinx 2.2.0 py_0",
"ripgrep 0.10.0 hc07d326_0",
"pexpect 4.7.0 py37_0",
"itsdangerous 1.1.0 py37_0",
"pango 1.42.4 h049681c_0",
"mkl 2019.4 243",
"sympy 1.4 py37_0",
"soupsieve 1.9.3 py37_0",
"networkx 2.3 py_0",
"sphinxcontrib-serializinghtml 1.1.3 py_0",
"jeepney 0.4.1 py_0",
"llvmlite 0.29.0 py37hd408876_0",
"wurlitzer 1.0.3 py37_0",
"jupyter_console 6.0.0 py37_0",
"pyparsing 2.4.2 py_0",
"numba 0.45.1 py37h962f231_0",
"defusedxml 0.6.0 py_0",
"tk 8.6.8 hbc83047_0",
"jupyter 1.0.0 py37_7",
"libpng 1.6.37 hbc83047_0",
"xlrd 1.2.0 py37_0",
"locket 0.2.0 py37_1",
"psutil 5.6.3 py37h7b6447c_0",
"backports.os 0.1.1 py37_0",
"spyder-kernels 0.5.2 py37_0",
"numexpr 2.7.0 py37h9e4a6bb_0",
"json5 0.8.5 py_0",
"imageio 2.5.0 py37_0",
"boto 2.49.0 py37_0",
"simplegeneric 0.8.1 py37_2",
"patchelf 0.9 he6710b0_3",
"libgcc-ng 9.1.0 hdf63c60_0",
"pyodbc 4.0.27 py37he6710b0_0",
"ninja 1.9.0 py37hfd86e86_0",
"prompt_toolkit 2.0.9 py37_0",
"lz4-c 1.8.1.2 h14c3975_0",
"joblib 0.13.2 py37_0",
"olefile 0.46 py37_0",
"scikit-image 0.15.0 py37he6710b0_0",
"sphinxcontrib-applehelp 1.0.1 py_0",
"ruamel_yaml 0.15.46 py37h14c3975_0",
"setuptools 41.2.0 py37_0",
"chardet 3.0.4 py37_1003",
"gmp 6.1.2 h6c8ec71_1",
"pyyaml 5.1.2 py37h7b6447c_0",
"conda-env 2.6.0 1",
"certifi 2019.9.11 py37_0",
"fsspec 0.5.1 py_0",
"h5py 2.9.0 py37h7918eee_0",
"_anaconda_depends 2019.03 py37_0",
"testpath 0.4.2 py37_0",
"cairo 1.14.12 h8948797_3",
"get_terminal_size 1.0.0 haa9412d_0",
"sip 4.19.8 py37hf484d3e_0",
"unicodecsv 0.14.1 py37_0",
"anaconda-navigator 1.9.7 py37_0",
"isort 4.3.21 py37_0",
"harfbuzz 1.8.8 hffaf4a1_0",
"sphinxcontrib-websupport 1.1.2 py_0",
"libxcb 1.13 h1bed415_1",
"statsmodels 0.10.1 py37hdd07704_0",
"libtool 2.4.6 h7b6447c_5",
"nbformat 4.4.0 py37_0",
"zeromq 4.3.1 he6710b0_3",
"glob2 0.7 py_0",
"fribidi 1.0.5 h7b6447c_0",
"libxml2 2.9.9 hea5a465_1",
"mpmath 1.1.0 py37_0",
"sqlite 3.29.0 h7b6447c_0",
"kiwisolver 1.1.0 py37he6710b0_0",
"backports.weakref 1.0.post1 py_1",
"bottleneck 1.2.1 py37h035aef0_1",
"filelock 3.0.12 py_0",
"fontconfig 2.13.0 h9420a91_0",
"intel-openmp 2019.4 243",
"jsonschema 3.0.2 py37_0",
"nose 1.3.7 py37_2",
"readline 7.0 h7b6447c_5",
"wrapt 1.11.2 py37h7b6447c_0",
"icu 58.2 h9c2bf20_1",
"openpyxl 2.6.3 py_0",
"sortedcontainers 2.1.0 py37_0",
"pytz 2019.2 py_0",
"snappy 1.1.7 hbae5bb6_3",
"pytest-openfiles 0.4.0 py_0",
"docutils 0.15.2 py37_0",
"py-lief 0.9.0 py37h7725739_2",
"asn1crypto 0.24.0 py37_0",
"xlsxwriter 1.2.1 py_0",
"python-dateutil 2.8.0 py37_0",
"backcall 0.1.0 py37_0",
"html5lib 1.0.1 py37_0",
"babel 2.7.0 py_0",
"decorator 4.4.0 py37_1",
"gstreamer 1.14.0 hb453b48_1",
"gst-plugins-base 1.14.0 hbbd80ab_1",
"tblib 1.4.0 py_0",
"sphinxcontrib-qthelp 1.0.2 py_0",
"click 7.0 py37_0",
"pytables 3.5.2 py37h71ec239_1",
"pytest-doctestplus 0.4.0 py_0",
"fastcache 1.1.0 py37h7b6447c_0",
"blosc 1.16.3 hd408876_0",
"ca-certificates 2019.8.28 0",
"ipywidgets 7.5.1 py_0",
"hdf5 1.10.4 hb1b8bf9_0",
"pillow 6.1.0 py37h34e0f95_0",
"pycosat 0.6.3 py37h14c3975_0",
"distributed 2.4.0 py_0",
"jupyterlab_server 1.0.6 py_0",
"seaborn 0.9.0 py37_0",
"heapdict 1.0.1 py_0",
"pickleshare 0.7.5 py37_0",
"jupyterlab 1.1.4 pyhf63ae98_0",
"cytoolz 0.10.0 py37h7b6447c_0",
"ply 3.11 py37_0",
"mkl_fft 1.0.14 py37ha843d7b_0",
"navigator-updater 0.2.1 py37_0",
"bzip2 1.0.8 h7b6447c_0",
"backports.tempfile 1.0 py_1",
"prometheus_client 0.7.1 py_0",
"qtconsole 4.5.5 py_0",
"anaconda-project 0.8.3 py_0",
"astropy 3.2.1 py37h7b6447c_0",
"widgetsnbextension 3.5.1 py37_0",
"lxml 4.4.1 py37hefd8a0e_0",
"keyring 18.0.0 py37_0",
"jedi 0.15.1 py37_0",
"pywavelets 1.0.3 py37hdd07704_1",
"pyzmq 18.1.0 py37he6710b0_0",
"send2trash 1.5.0 py37_0",
"pandas 0.25.1 py37he6710b0_0",
"six 1.12.0 py37_0",
"snowballstemmer 1.9.1 py_0",
"pycparser 2.19 py37_0",
"mpfr 4.0.1 hdf1c602_3",
"scipy 1.3.1 py37h7c811a0_0",
"secretstorage 3.1.1 py37_0",
"backports.functools_lru_cache 1.5 py_2",
"zipp 0.6.0 py_0",
"_ipyw_jlab_nb_ext_conf 0.1.0 py37_0",
"importlib_metadata 0.23 py37_0",
"pandocfilters 1.4.2 py37_1",
"pysocks 1.7.1 py37_0",
"alabaster 0.7.12 py37_0",
"parso 0.5.1 py_0",
"blas 1.0 mkl",
"astroid 2.2.5 py37_0",
"libxslt 1.1.33 h7d1a2b0_0",
"ptyprocess 0.6.0 py37_0",
"bokeh 1.3.4 py37_0",
"msgpack-python 0.6.1 py37hfd86e86_1",
"gevent 1.4.0 py37h7b6447c_0",
"conda 4.7.12 py37_0",
"py 1.8.0 py37_0",
"bleach 3.1.0 py37_0",
"flask 1.1.1 py_0",
"terminado 0.8.2 py37_0",
"conda-verify 3.4.2 py_1",
"python-libarchive-c 2.8 py37_13",
"libstdcxx-ng 9.1.0 hdf63c60_0",
"qt 5.9.7 h5867ecd_1",
"entrypoints 0.3 py37_0",
"gmpy2 2.0.8 py37h10f8cd9_2",
"matplotlib 3.1.1 py37h5429711_0",
"atomicwrites 1.3.0 py37_1",
"jpeg 9b h024ee3a_2",
"traitlets 4.3.2 py37_0",
"pycodestyle 2.5.0 py37_0",
"pytest-arraydiff 0.3 py37h39e3cac_0",
"singledispatch 3.4.0.3 py37_0",
"requests 2.22.0 py37_0",
"expat 2.2.6 he6710b0_0",
"unixodbc 2.3.7 h14c3975_0",
"python 3.7.3 h0371630_0",
"jinja2 2.10.1 py37_0",
"pyopenssl 19.0.0 py37_0",
"zict 1.0.0 py_0",
"xlwt 1.3.0 py37_0",
"et_xmlfile 1.0.1 py37_0",
"idna 2.8 py37_0",
"imagesize 1.1.0 py37_0",
"spyder 3.3.6 py37_0",
"backports 1.0 py_2",
"numpydoc 0.9.1 py_0",
"jupyter_client 5.3.3 py37_1",
"_libgcc_mutex 0.1 main",
"mkl-service 2.3.0 py37he904b0f_0",
"sortedcollections 1.1.2 py37_0",
"torchvision 0.4.0 py37_cu100",
"webencodings 0.5.1 py37_1",
"anaconda-client 1.7.2 py37_0",
"pylint 2.3.1 py37_0",
"rope 0.14.0 py_0",
"cycler 0.10.0 py37_0",
"qtawesome 0.6.0 py_0",
"mkl_random 1.1.0 py37hd6b4f25_0",
"pyrsistent 0.15.4 py37h7b6447c_0",
"pixman 0.38.0 h7b6447c_0",
"pcre 8.43 he6710b0_0",
"more-itertools 7.2.0 py37_0",
"cudatoolkit 10.0.130 0",
"dbus 1.13.6 h746ee38_0",
"ipython_genutils 0.2.0 py37_0",
"tornado 6.0.3 py37h7b6447c_0",
"libffi 3.2.1 hd88cf55_4",
"jbig 2.1 hdba287a_0",
"cython 0.29.13 py37he6710b0_0",
"openssl 1.1.1d h7b6447c_1",
"libuuid 1.0.3 h1bed415_2",
"mccabe 0.6.1 py37_1",
"tbb 2019.4 hfd86e86_0",
"lzo 2.10 h49e0be7_2",
"multipledispatch 0.6.0 py37_0",
"libcurl 7.65.3 h20c2e04_0",
"pluggy 0.13.0 py37_0",
"ncurses 6.1 he6710b0_1",
"pkginfo 1.5.0.1 py37_0",
"dask 2.4.0 py_0",
"lazy-object-proxy 1.4.2 py37h7b6447c_0",
"libgfortran-ng 7.3.0 hdf63c60_0",
"conda-build 3.18.8 py37_0",
"zstd 1.3.7 h0b5b093_0",
"liblief 0.9.0 h7725739_2",
"glib 2.56.2 hd408876_0",
"pathlib2 2.3.4 py37_0",
"pip 19.2.3 py37_0",
"pyflakes 2.1.1 py37_0",
"markupsafe 1.1.1 py37h7b6447c_0",
"yaml 0.1.7 had09818_2",
"greenlet 0.4.15 py37h7b6447c_0",
"toolz 0.10.0 py_0",
"pytorch 1.2.0 py3.7_cuda10.0.130_cudnn7.6.2_0",
"future 0.17.1 py37_0",
"scikit-learn 0.21.3 py37hd81dba3_0",
"attrs 19.1.0 py37_1",
"jdcal 1.4.1 py_0",
"pyqt 5.9.2 py37h05f1152_2",
"pytest-remotedata 0.3.2 py37_0",
"curl 7.65.3 hbc83047_0",
"xz 5.2.4 h14c3975_4",
"ipykernel 5.1.2 py37h39e3cac_0",
"contextlib2 0.6.0 py_0",
"jupyter_core 4.5.0 py_0",
"pygments 2.4.2 py_0",
"conda-package-handling 1.6.0 py37h7b6447c_0",
"pandoc 2.2.3.2 0",
"sphinxcontrib-jsmath 1.0.1 py_0",
"backports.shutil_get_terminal_size 1.0.0 py37_2",
"nbconvert 5.6.0 py37_1",
"dask-core 2.4.0 py_0",
"freetype 2.9.1 h8a8886c_1",
"numpy 1.17.2 py37haad9e8e_0",
"graphite2 1.3.13 h23475e2_0",
"sphinxcontrib 1.0 py37_1",
"path.py 12.0.1 py_0",
"packaging 19.2 py_0",
"pycrypto 2.6.1 py37h14c3975_9",
"patsy 0.5.1 py37_0",
"wcwidth 0.1.7 py37_0",
"libedit 3.1.20181209 hc058e9b_0",
"notebook 6.0.1 py37_0",
"libsodium 1.0.16 h1bed415_0",
"sphinxcontrib-devhelp 1.0.1 py_0",
"bkcharts 0.2 py37_0",
"colorama 0.4.1 py37_0",
"urllib3 1.24.2 py37_0",
"tqdm 4.36.1 py_0"
],
"summary": "Manage calls to calloc/free through Cython",
"tags": []
}
'info/index.json'
fwhl = wheelfile.WheelFile(whl)
fwhl.parsed_filename.groupdict()
{'namever': 'cymem-2.0.2',
'name': 'cymem',
'ver': '2.0.2',
'build': None,
'pyver': 'cp37',
'abi': 'cp37m',
'plat': 'manylinux1_x86_64'}
fwhl.dist_info_path
'cymem-2.0.2.dist-info'
fwhl.record_path
'cymem-2.0.2.dist-info/RECORD'
read_python_record(whl.parent, fwhl.record_path, '3.7')['paths_data'].paths
(PathDataV1(_path='lib/python3.7/site-packages/cymem-2.0.2.dist-info/LICENSE', path_type='hardlink', sha256='ednboUtKqeqeBouyYb59GvQN9K04gEyyw2KwK5cPxHo', size_in_bytes=1139), PathDataV1(_path='lib/python3.7/site-packages/cymem-2.0.2.dist-info/METADATA', path_type='hardlink', sha256='9tePG2KbFvrQ1Sy86GeZfihXDryyKcI1jS_7ZDcrTjc', size_in_bytes=8585), PathDataV1(_path='lib/python3.7/site-packages/cymem-2.0.2.dist-info/RECORD', path_type='hardlink', sha256=None, size_in_bytes=None), PathDataV1(_path='lib/python3.7/site-packages/cymem-2.0.2.dist-info/WHEEL', path_type='hardlink', sha256='QNlK5ivAimyKC6GBwwJ1xZo1FLZqOgbKwJoOKciA_fE', size_in_bytes=109), PathDataV1(_path='lib/python3.7/site-packages/cymem-2.0.2.dist-info/top_level.txt', path_type='hardlink', sha256='dCYwCFWTj_NE7Z9zFrrKqAcWuUCtg52zKRI4l_Wrr7Q', size_in_bytes=6), PathDataV1(_path='lib/python3.7/site-packages/cymem/__init__.pxd', path_type='hardlink', sha256='47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU', size_in_bytes=0), PathDataV1(_path='lib/python3.7/site-packages/cymem/__init__.py', path_type='hardlink', sha256='SZPicygro0c1rh3QY-iN21ZormYrSBeim1R2DSeaOH4', size_in_bytes=21), PathDataV1(_path='lib/python3.7/site-packages/cymem/__pycache__/__init__.cpython-37.pyc', path_type='hardlink', sha256=None, size_in_bytes=None), PathDataV1(_path='lib/python3.7/site-packages/cymem/__pycache__/about.cpython-37.pyc', path_type='hardlink', sha256=None, size_in_bytes=None), PathDataV1(_path='lib/python3.7/site-packages/cymem/about.py', path_type='hardlink', sha256='7Xg2PhAIoeQIQPl1j47Cs8xRWscmh_-0NZeg96zh7Sg', size_in_bytes=409), PathDataV1(_path='lib/python3.7/site-packages/cymem/cymem.cpython-37m-x86_64-linux-gnu.so', path_type='hardlink', sha256='R36ORe5NmBlxQLAFXySgI6lEqlY899mV4iQek3H2Cbo', size_in_bytes=61176), PathDataV1(_path='lib/python3.7/site-packages/cymem/cymem.pxd', path_type='hardlink', sha256='3a6VyWkQ-d6GelUOGNtdTAAg2ksWKjW9mUMu5UzR2zc', size_in_bytes=779), PathDataV1(_path='lib/python3.7/site-packages/cymem/cymem.pyx', path_type='hardlink', sha256='NjYVjVg1HisdH8RIoCLc7CMOGMmQ7mknyl5Ztcd8XOQ', size_in_bytes=5343), PathDataV1(_path='lib/python3.7/site-packages/cymem/tests/__pycache__/test_import.cpython-37.pyc', path_type='hardlink', sha256=None, size_in_bytes=None), PathDataV1(_path='lib/python3.7/site-packages/cymem/tests/test_import.py', path_type='hardlink', sha256='QP4VhFs618LeiJvBSEfZh3deETbWxuzir1mEfL-fOV0', size_in_bytes=263))
fwhl.namelist()
['cymem/cymem.pxd', 'cymem/cymem.pyx', 'cymem/__init__.py', 'cymem/__init__.pxd', 'cymem/cymem.cpython-37m-x86_64-linux-gnu.so', 'cymem/about.py', 'cymem/tests/test_import.py', 'cymem-2.0.2.dist-info/METADATA', 'cymem-2.0.2.dist-info/LICENSE', 'cymem-2.0.2.dist-info/RECORD', 'cymem-2.0.2.dist-info/top_level.txt', 'cymem-2.0.2.dist-info/WHEEL']
from wheel.metadata import pkginfo_to_metadata
meta = fwhl.read(f'{fwhl.dist_info_path}/METADATA').decode()
m = Parser().parsestr(meta)
m.items()
[('Metadata-Version', '2.1'),
('Name', 'cymem'),
('Version', '2.0.2'),
('Summary', 'Manage calls to calloc/free through Cython'),
('Home-page', 'https://github.com/explosion/cymem'),
('Author', 'Matthew Honnibal'),
('Author-email', 'matt@explosion.ai'),
('License', 'MIT'),
('Platform', 'UNKNOWN'),
('Classifier', 'Environment :: Console'),
('Classifier', 'Intended Audience :: Developers'),
('Classifier', 'Intended Audience :: Science/Research'),
('Classifier', 'License :: OSI Approved :: MIT License'),
('Classifier', 'Operating System :: POSIX :: Linux'),
('Classifier', 'Operating System :: MacOS :: MacOS X'),
('Classifier', 'Operating System :: Microsoft :: Windows'),
('Classifier', 'Programming Language :: Cython'),
('Classifier', 'Programming Language :: Python :: 2.6'),
('Classifier', 'Programming Language :: Python :: 2.7'),
('Classifier', 'Programming Language :: Python :: 3.3'),
('Classifier', 'Programming Language :: Python :: 3.4'),
('Classifier', 'Programming Language :: Python :: 3.5'),
('Classifier', 'Programming Language :: Python :: 3.6'),
('Classifier', 'Programming Language :: Python :: 3.7'),
('Classifier', 'Topic :: Scientific/Engineering')]
zip_ref = zipfile.ZipFile(whl,"r")
ls = zip_ref.filelist
[(i,o.filename) for i,o in enumerate(ls)]
[(0, 'cymem/cymem.pxd'), (1, 'cymem/cymem.pyx'), (2, 'cymem/__init__.py'), (3, 'cymem/__init__.pxd'), (4, 'cymem/cymem.cpython-37m-x86_64-linux-gnu.so'), (5, 'cymem/about.py'), (6, 'cymem/tests/test_import.py'), (7, 'cymem-2.0.2.dist-info/METADATA'), (8, 'cymem-2.0.2.dist-info/LICENSE'), (9, 'cymem-2.0.2.dist-info/RECORD'), (10, 'cymem-2.0.2.dist-info/top_level.txt'), (11, 'cymem-2.0.2.dist-info/WHEEL')]
fn = ls[11]
f = zip_ref.read(fn)
print(f.decode())
fn.filename
Wheel-Version: 1.0 Generator: bdist_wheel (0.32.1) Root-Is-Purelib: false Tag: cp37-cp37m-manylinux1_x86_64
'cymem-2.0.2.dist-info/WHEEL'