New GitHub issue #100961 from huonw:<br>
<hr>
<pre>
# 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:
```python
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:
```shell
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`
</pre>
<hr>
<a href="https://github.com/python/cpython/issues/100961">View on GitHub</a>
<p>Labels: type-bug</p>
<p>Assignee: </p>