`profile` and `cProfile` cannot profile a directory or PEP-441 zip file
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 36k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug report
Python can execute zip files (PEP-441) and directories directly, e.g. python code.zip or python directory, if they're constructed appropriately (such as via zipapp or https://github.com/pantsbuild/pex). These don't work with profile or cProfile modules, e.g. python -m profile code.zip fails with ValueError: source code string cannot contain null bytes and python -m cProfile directory fails with IsADirectoryError: [Errno 21] Is a directory: 'directory'.
For example: https://gist.github.com/huonw/52574abce4057afd99abb5e4a7f82b61 has a simple __main__.py and a zip file that contains it:
import sys
print(f"Hello from {sys.argv[0]}")
There's a script that runs all 9 combinations of zip vs. file vs. directory, and no profiling vs. profile vs cProfile. It can be executed via:
git clone https://gist.github.com/huonw/52574abce4057afd99abb5e4a7f82b61
cd 52574abce4057afd99abb5e4a7f82b61
./script.sh
Output of script.sh:
updating: __main__.py (stored 0%)
Archive: code.zip
extracting: directory/__main__.py
Python 3.11.0
*** Running without profiling
Hello from __main__.py
Hello from code.zip
Hello from directory
*** Running with 'profile'
Hello from __main__.py
** BUG:
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/profile.py", line 610, in <module>
main()
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/profile.py", line 591, in main
code = compile(fp.read(), progname, 'exec')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: source code string cannot contain null bytes
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/profile.py", line 610, in <module>
main()
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/profile.py", line 590, in main
with open(progname, 'rb') as fp:
^^^^^^^^^^^^^^^^^^^^
IsADirectoryError: [Errno 21] Is a directory: 'directory'
*** Running with 'cProfile'
Hello from __main__.py
** BUG:
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/cProfile.py", line 190, in <module>
main()
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/cProfile.py", line 171, in main
code = compile(fp.read(), progname, 'exec')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: source code string cannot contain null bytes
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/cProfile.py", line 190, in <module>
main()
File "/Users/huon/.pyenv/versions/3.11.0/lib/python3.11/cProfile.py", line 170, in main
with open(progname, 'rb') as fp:
^^^^^^^^^^^^^^^^^^^^
IsADirectoryError: [Errno 21] Is a directory: 'directory'
Workarounds:
- for a zip, manually unzip, and then run the
__main__.py, e.g.unzip code.zip -d directory && python -m cProfile directory/__main__.py. - for a directory, run the
__main__.py, e.g.python -m cPorfile directory/__main__.py
Your environment
- CPython versions tested on: 3.9.10, 3.10.4, 3.11.0
- Operating system and architecture:
python -m platform==macOS-12.5.1-arm64-arm-64bit
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne bei den Moduleinstiegspunkten von profile.py und cProfile.py und führe dann den bereitgestellten Reproducer script.sh für die Fälle Datei, ZIP und Verzeichnis aus. Als erledigt gilt die Aufgabe, wenn beide Profiling-Befehle PEP-441-ZIP-Dateien und ausführbare Verzeichnisse ohne den gemeldeten ValueError oder IsADirectoryError verarbeiten.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- tooling
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100