`profile` and `cProfile` cannot profile a directory or PEP-441 zip file
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 77.2k
- Fork
- 36k
- Merge medio
- 1g 9h
- PR unite (30g)
- 558
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia dagli entry point del modulo di profile.py e cProfile.py, quindi esegui il riproduttore fornito script.sh per i casi di file, ZIP e directory. Il lavoro è completato quando entrambi i comandi di profilazione gestiscono i file ZIP PEP-441 e le directory eseguibili senza il ValueError o l’IsADirectoryError segnalato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- tooling
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 42/100