Created
December 14, 2019 00:41
-
-
Save michaelaye/db52a83ca0dc342855c3d570bbc476a9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from conda.cli.python_api import Commands, run_command" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"class CondaList:\n", | |
" \"\"\"Manage Conda list output.\n", | |
" \n", | |
" Attributes\n", | |
" ----------\n", | |
" env : string\n", | |
" Name of the conda env for which the list command was run.\n", | |
" colnames : list\n", | |
" List of column names in the parsed dataframe.\n", | |
" In 2019-12, this was ['Name', 'Version', 'Build', 'Channel']\n", | |
" df : pd.DataFrame\n", | |
" Dataframe with the installed package data for the current environment\n", | |
" pip_items : pd.DataFrame\n", | |
" self.df filtered for only packages installed via pip\n", | |
" \"\"\"\n", | |
" def __init__(self):\n", | |
" self.results = run_command(Commands.LIST)[0].split('\\n')\n", | |
" self.parse_results()\n", | |
" \n", | |
" @property\n", | |
" def env(self):\n", | |
" return self.results[0].split()[-1].split('/')[-1][:-1]\n", | |
" \n", | |
" @property\n", | |
" def colnames(self):\n", | |
" return self.results[2].strip('#').strip().split()\n", | |
" \n", | |
" def parse_results(self):\n", | |
" data = self.results[3:]\n", | |
" self.df = pd.DataFrame([line.split() for line in data], columns=self.colnames)\n", | |
" \n", | |
" @property\n", | |
" def pip_items(self):\n", | |
" return self.df.query(\"Channel=='pypi'\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"condalist = CondaList()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'py37'" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"condalist.env" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['Name', 'Version', 'Build', 'Channel']" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"condalist.colnames" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Name</th>\n", | |
" <th>Version</th>\n", | |
" <th>Build</th>\n", | |
" <th>Channel</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>advbumpversion</td>\n", | |
" <td>1.2.0</td>\n", | |
" <td>py_0</td>\n", | |
" <td>conda-forge</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>aiohttp</td>\n", | |
" <td>3.6.2</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>alabaster</td>\n", | |
" <td>0.7.12</td>\n", | |
" <td>py_0</td>\n", | |
" <td>conda-forge</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>altair</td>\n", | |
" <td>4.0.0</td>\n", | |
" <td>py_0</td>\n", | |
" <td>conda-forge</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>apipkg</td>\n", | |
" <td>1.5</td>\n", | |
" <td>py_0</td>\n", | |
" <td>conda-forge</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Name Version Build Channel\n", | |
"0 advbumpversion 1.2.0 py_0 conda-forge\n", | |
"1 aiohttp 3.6.2 pypi_0 pypi\n", | |
"2 alabaster 0.7.12 py_0 conda-forge\n", | |
"3 altair 4.0.0 py_0 conda-forge\n", | |
"4 apipkg 1.5 py_0 conda-forge" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"condalist.df.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Name</th>\n", | |
" <th>Version</th>\n", | |
" <th>Build</th>\n", | |
" <th>Channel</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>aiohttp</td>\n", | |
" <td>3.6.2</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>10</th>\n", | |
" <td>async-timeout</td>\n", | |
" <td>3.0.1</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>52</th>\n", | |
" <td>dask-labextension</td>\n", | |
" <td>1.0.3</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>61</th>\n", | |
" <td>dulwich</td>\n", | |
" <td>0.19.14</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>100</th>\n", | |
" <td>importlib-resources</td>\n", | |
" <td>1.0.2</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>118</th>\n", | |
" <td>jupyter-server-proxy</td>\n", | |
" <td>1.2.0</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>126</th>\n", | |
" <td>jupyterlab-github</td>\n", | |
" <td>1.0.0</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>179</th>\n", | |
" <td>multidict</td>\n", | |
" <td>4.7.1</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>183</th>\n", | |
" <td>nb-black</td>\n", | |
" <td>1.0.7</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>188</th>\n", | |
" <td>nbresuse</td>\n", | |
" <td>0.3.3</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>218</th>\n", | |
" <td>pbr</td>\n", | |
" <td>5.4.4</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>220</th>\n", | |
" <td>pds4-tools</td>\n", | |
" <td>1.1</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>227</th>\n", | |
" <td>pip-api</td>\n", | |
" <td>0.0.13</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>262</th>\n", | |
" <td>pyqt5</td>\n", | |
" <td>5.13.2</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>263</th>\n", | |
" <td>pyqt5-sip</td>\n", | |
" <td>12.7.0</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>264</th>\n", | |
" <td>pyqtwebengine</td>\n", | |
" <td>5.13.2</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>267</th>\n", | |
" <td>pysis</td>\n", | |
" <td>0.6.0</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>296</th>\n", | |
" <td>reno</td>\n", | |
" <td>2.11.3</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>313</th>\n", | |
" <td>simpervisor</td>\n", | |
" <td>0.3</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>363</th>\n", | |
" <td>yarl</td>\n", | |
" <td>1.4.2</td>\n", | |
" <td>pypi_0</td>\n", | |
" <td>pypi</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Name Version Build Channel\n", | |
"1 aiohttp 3.6.2 pypi_0 pypi\n", | |
"10 async-timeout 3.0.1 pypi_0 pypi\n", | |
"52 dask-labextension 1.0.3 pypi_0 pypi\n", | |
"61 dulwich 0.19.14 pypi_0 pypi\n", | |
"100 importlib-resources 1.0.2 pypi_0 pypi\n", | |
"118 jupyter-server-proxy 1.2.0 pypi_0 pypi\n", | |
"126 jupyterlab-github 1.0.0 pypi_0 pypi\n", | |
"179 multidict 4.7.1 pypi_0 pypi\n", | |
"183 nb-black 1.0.7 pypi_0 pypi\n", | |
"188 nbresuse 0.3.3 pypi_0 pypi\n", | |
"218 pbr 5.4.4 pypi_0 pypi\n", | |
"220 pds4-tools 1.1 pypi_0 pypi\n", | |
"227 pip-api 0.0.13 pypi_0 pypi\n", | |
"262 pyqt5 5.13.2 pypi_0 pypi\n", | |
"263 pyqt5-sip 12.7.0 pypi_0 pypi\n", | |
"264 pyqtwebengine 5.13.2 pypi_0 pypi\n", | |
"267 pysis 0.6.0 pypi_0 pypi\n", | |
"296 reno 2.11.3 pypi_0 pypi\n", | |
"313 simpervisor 0.3 pypi_0 pypi\n", | |
"363 yarl 1.4.2 pypi_0 pypi" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"condalist.pip_items" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now I can use the `sh` package to update my pip packages only:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import sh" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"pip_cmd = sh.Command('pip').bake('install').bake('-U')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Updating aiohttp\n", | |
"Updating async-timeout\n", | |
"Updating dask-labextension\n", | |
"Updating dulwich\n", | |
"Updating importlib-resources\n", | |
"Updating jupyter-server-proxy\n", | |
"Updating jupyterlab-github\n", | |
"Updating multidict\n", | |
"Updating nb-black\n", | |
"Updating nbresuse\n", | |
"Updating pbr\n", | |
"Updating pds4-tools\n", | |
"Updating pip-api\n", | |
"Updating pyqt5\n", | |
"Updating pyqt5-sip\n", | |
"Updating pyqtwebengine\n", | |
"Updating pysis\n", | |
"Updating reno\n", | |
"Updating simpervisor\n", | |
"Updating yarl\n" | |
] | |
} | |
], | |
"source": [ | |
"for item in condalist.pip_items.Name:\n", | |
" print(\"Updating\", item)\n", | |
" _ = pip_cmd(item)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python [conda env:py37] *", | |
"language": "python", | |
"name": "conda-env-py37-py" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.7.3" | |
}, | |
"widgets": { | |
"application/vnd.jupyter.widget-state+json": { | |
"state": {}, | |
"version_major": 2, | |
"version_minor": 0 | |
} | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment