From 3cdc5ceee1511fc87e2f59e7f49b7273355edf95 Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 19 May 2022 13:14:58 +0200 Subject: [PATCH 1/7] Remove linux_distribution from platform examples --- hands-on/system_information.ipynb | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/hands-on/system_information.ipynb b/hands-on/system_information.ipynb index 6590791..49760ac 100644 --- a/hands-on/system_information.ipynb +++ b/hands-on/system_information.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -152,15 +152,6 @@ "platform.version()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "platform.linux_distribution()" - ] - }, { "cell_type": "code", "execution_count": null, @@ -233,9 +224,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [], "source": [ "for process in psutil.process_iter():\n", @@ -432,7 +421,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -446,9 +435,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.5" + "version": "3.9.6" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From ca61ef72157698f66a8980a6831fe0ff2421fe6d Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 20 Apr 2023 13:18:17 +0200 Subject: [PATCH 2/7] Update slides * fix URL for recent version of Python * use f-strings rather than format method --- python_for_systems_programming.pptx | Bin 337902 -> 337837 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/python_for_systems_programming.pptx b/python_for_systems_programming.pptx index b3d90f53784973d50f981787b12b5b79d8c9bb02..1c8cb4797fab1c7626bd5d6e13a93ab49c0ee9ba 100644 GIT binary patch delta 30793 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 z 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 L2u|0)e1`ddG&Lox delta 30723 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 T{(t_^E?@xw0|8iQ0n+~iWc3q! From cb8e367cb1ff36dfc9518ae5bcd262df453562a5 Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 20 Apr 2023 14:14:01 +0200 Subject: [PATCH 3/7] Modernize code --- source-code/logging/log_it_all.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/source-code/logging/log_it_all.py b/source-code/logging/log_it_all.py index 840b506..02ad53a 100755 --- a/source-code/logging/log_it_all.py +++ b/source-code/logging/log_it_all.py @@ -3,30 +3,30 @@ from argparse import ArgumentParser import logging import math -import os +from pathlib import Path import sys def do_stuff(n): if n < 0: - logging.error('can not do stuff for {0}'.format(n)) + logging.error(f'can not do stuff for {n}') return 1 for i in range(n): - logging.info('doing stuff {0}'.format(str(i))) - print('doing {0}: {1:.4f}'.format(i, math.sqrt(i))) - logging.info('done stuff {0}'.format(str(i))) + logging.info(f'doing stuff {i}') + print(f'doing {i}: {math.sqrt(i):.4f}') + logging.info(f'done stuff {i}') return 0 def main(): arg_parser = ArgumentParser(description='example for logging facility') - arg_parser.add_argument('-log', dest='log_file', + arg_parser.add_argument('--log', dest='log_file', help='name of log file') - arg_parser.add_argument('-info', action='store_true', + arg_parser.add_argument('--info', action='store_true', help='set log level to info') - arg_parser.add_argument('-new_log', action='store_true', + arg_parser.add_argument('--new_log', action='store_true', help='overwrite existing log file') - arg_parser.add_argument('-n', type=int, default=1, + arg_parser.add_argument('--n', type=int, default=1, help='number of times to do stuff') options = arg_parser.parse_args() format_str = '%(asctime)s:%(levelname)s:%(message)s' @@ -39,14 +39,15 @@ def main(): else: filemode = 'a' if options.log_file: - exists = os.path.exists(options.log_file) + log_file = Path(options.log_file) + exists = log_file.exists() logging.basicConfig(level=level, filename=options.log_file, filemode=filemode, format=format_str) else: exists = False logging.basicConfig(level=level, format=format_str) if exists: - logging.warn('overwriting existing log file') + logging.warning('overwriting existing log file') logging.info('application started') logging.info('logger initialized') status = do_stuff(options.n) From 7e17dc3a3456c753f50b561de07bb20239aba841 Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 20 Apr 2023 14:25:55 +0200 Subject: [PATCH 4/7] Fix typo --- source-code/command-line-arguments/Fire/sayer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source-code/command-line-arguments/Fire/sayer.py b/source-code/command-line-arguments/Fire/sayer.py index 10bebdc..b583433 100755 --- a/source-code/command-line-arguments/Fire/sayer.py +++ b/source-code/command-line-arguments/Fire/sayer.py @@ -55,7 +55,7 @@ def __init__(self, hello_name=None, bye_name=None): self.bye = Bye(bye_name) def to(self): - return 'Do you want to say hello or bye' + return 'Do you want to say hello or bye?' def info(self): return 'This is version 0.1beta' From d384805c29e484d93b58a991100cf8aea22994e2 Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 20 Apr 2023 14:36:12 +0200 Subject: [PATCH 5/7] Modernize code --- source-code/data-formats/read_xml.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source-code/data-formats/read_xml.py b/source-code/data-formats/read_xml.py index 1254761..b3ba195 100755 --- a/source-code/data-formats/read_xml.py +++ b/source-code/data-formats/read_xml.py @@ -24,8 +24,7 @@ def finish(self): self._data.sort() def __str__(self): - return '\n'.join(['{0}: {1}'.format(self.name, x) - for x in self._data]) + return '\n'.join([f'{self.name}: {value}' for value in self._data]) class BlocksHandler(ContentHandler): @@ -54,10 +53,8 @@ def startDocument(self): def startElement(self, name, attrs): if name == 'block': - logging.info('start of {0}'.format(attrs.getValue('name'))) - parent_name = '' - if self._stack: - parent_name = self._stack[-1].name + '/' + logging.info(f'start of {attrs.getValue("name")}') + parent_name = f'{self._stack[-1].name}/' if self._stack else '' block = Block(parent_name + attrs.getValue('name')) self._stack.append(block) elif name == 'item': @@ -68,7 +65,7 @@ def characters(self, contents): contents = contents.strip() if contents: data = float(contents.strip()) - logging.info("found '{0}'".format(data)) + logging.info(f"found '{data}'") self._stack[-1].add_data(data) def endElement(self, name): @@ -76,7 +73,7 @@ def endElement(self, name): block = self._stack.pop() block.finish() self._blocks.append(block) - logging.info('end of {0}'.format(block.name)) + logging.info(f'end of {block.name}') elif name == 'item': self.in_item = False @@ -86,7 +83,7 @@ def endDocument(self): def main(): arg_parser = ArgumentParser(description='reformat XML code') - arg_parser.add_argument('-verbose', action='store_true', + arg_parser.add_argument('--verbose', action='store_true', help='print verbose output') arg_parser.add_argument('file', type=FileType('r'), help='XML file to convert') From 45f85b981ee838e7f08c23f6729467c7d1913c80 Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 20 Apr 2023 15:02:07 +0200 Subject: [PATCH 6/7] Fix various small things * Leave directory clean by removing temporary directory * Change processes to list from chrome to python * Fix typos --- hands-on/shell_interaction.ipynb | 85 ++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 16 deletions(-) diff --git a/hands-on/shell_interaction.ipynb b/hands-on/shell_interaction.ipynb index 98a28c1..b394d12 100644 --- a/hands-on/shell_interaction.ipynb +++ b/hands-on/shell_interaction.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Intereacting with the shell" + "# Interacting with the shell" ] }, { @@ -18,7 +18,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The [`sh` module](https://amoffat.github.io/sh/) is very convenient to interact with the shell. Note that `sh` is not part of Python's standard library, if you prefer not to use extra modules, use the `subprocess` module in the standard library." + "The [`sh` module](https://amoffat.github.io/sh/) is very convenient to interact with the shell. Note that `sh` is not part of Python's standard library, if you prefer not to use extra modules, use the `subprocess` module in the standard library. The statements below will install `sh` using `pip` is it isn't already installed." ] }, { @@ -27,16 +27,12 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install sh" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sh" + "try:\n", + " import sh\n", + "except ModuleNotFoundError:\n", + " print('installing sh using pip')\n", + " !pip install sh\n", + " import sh" ] }, { @@ -314,7 +310,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "try:\n", @@ -323,6 +321,29 @@ " print(error)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clean up" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove the `tmp` directory." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sh.rm('-rf', 'tmp')" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -605,11 +626,43 @@ " env=environ, shell=True)\n", "print(process.stdout.rstrip())" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Clean up" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove the `tmp` directory." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "process = subprocess.run(['rm', '-rf', 'tmp'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "process.returncode" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -623,9 +676,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.5" + "version": "3.11.3" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 6817dbd2efed78e75b5783e6c0d94c744a993fe3 Mon Sep 17 00:00:00 2001 From: Geert Jan Bex Date: Thu, 20 Apr 2023 15:04:44 +0200 Subject: [PATCH 7/7] Add conditional installation of sh --- hands-on/system_information.ipynb | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/hands-on/system_information.ipynb b/hands-on/system_information.ipynb index 49760ac..1abd216 100644 --- a/hands-on/system_information.ipynb +++ b/hands-on/system_information.ipynb @@ -12,7 +12,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Install `sh` since it doesn't seem to be available." + "Install `sh` if it doesn't seem to be available." ] }, { @@ -20,21 +20,17 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "!pip install sh" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], "source": [ "from datetime import datetime\n", "import os\n", "import platform\n", "import psutil\n", - "import sh\n", + "try:\n", + " import sh\n", + "except ModuleNotFoundError:\n", + " print('installing sh using pip')\n", + " !pip install sh\n", + " import sh\n", "import sys" ] }, @@ -228,7 +224,7 @@ "outputs": [], "source": [ "for process in psutil.process_iter():\n", - " if 'chrome' in process.name():\n", + " if 'python' in process.name():\n", " cpu_times = process.cpu_times()\n", " thread_str = f'threads: {process.num_threads()}'\n", " cpu_str = f'user: {cpu_times.user}, sys: {cpu_times.system}'\n", @@ -317,7 +313,8 @@ "outputs": [], "source": [ "for user in psutil.users():\n", - " started = datetime.strftime(datetime.fromtimestamp(user.started), '%Y-%m-%d %H:%M:%S')\n", + " started = datetime.strftime(datetime.fromtimestamp(user.started),\n", + " '%Y-%m-%d %H:%M:%S')\n", " print(f'{user.name}: {started}')" ] }, @@ -435,7 +432,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.11.3" } }, "nbformat": 4,