Update page 'Day 9 homework'

j
2023-04-18 11:28:27 +02:00
parent a6210ea262
commit 6eaaf8295a
+12
@@ -0,0 +1,12 @@
Today's homework will be to build a tool to introspect Python packages, from the perspective of the currently running Python interpreter.
1. Use `importlib.util.find_spec` to create a function that takes a Python module or package name, and returns the total number of bytes in the cached `.pyc` file, or the total number of bytes in the `.py` file if there is no cached bytecode. You can use the os.stat command to get the size of a file.
2. Create another function that uses the last function to see how many bytes are in all the modules listed in sys.modules.
3. Run your Python interpreter like you would normally, using Jupyter, and run the last function. How many bytes are being used?
4. Now, run the same function, but start the Python interpreter in Powershell (Windows), or the regular shell (MacOS/Linux) with the `-E` flag, which ignores environment variables and should only load the modules that came with the original build of the Python interpreter. How many bytes are being used now?
5. With only the `sys` module loaded, look at the `sys.modules` dict. What is the type of the value of the `os` key?
6. Import the os module. What happens when you type `type(os)`?
7. Restart the Python interpreter. Can you figure out how to call `os.getlogin()` without saying `import os`?
8. If you can, explain why this works and quote the relevant sections of section 5 in the language reference.
9. Using the functions you created above and `sys.modules`, create a module designed to be run from the command line (`python -m myscript.py`) that generates a report summarizing the module environment, and break down the percentages of bytecode modules, DSO modules (these have `__file__` end in `.so` or `.dll`), and normal python code.
10. Add a feature to the script which looks at `__file__` for each module, trims the filename to get the directory name, then prints out a histogram of how many modules are in each directory name. If you can't find a text histogram output library in anaconda's built-in modules, just print out the `*` character for each module.