Python does not detect .pyc files
Question:
I am using Python 3.2 (both for building and executing), and here is my question.
I intend to ship my python application with the following setup:
There is a main script (say, Main.py
), that is using a compiled module, say Module1.pyc
). To be precise, the directory structure is:
.Main.py
.__pycache__Module1.cpython-32.pyc
When I use the python interpreter to run the main script, it fails to find the module with the following error:
Traceback (most recent call last):
File "Main.py", line 10, in <module>
import Module1
ImportError: No module named Module1
Note that I have added the current directory to PYTHONPATH
environment variable, and is part of sys.path
. Also, the inner __pycache__
directory is also added, and is visible in sys.path
.
Not sure why Module1 is not found. Am guessing, it could be because of the different file name – Module1.cpython-32.pyc? But, then that is how the Python 3.2 interpreter generates it.
Answers:
Have a look at PEP-3147. They describe how the python-lookup mechanism works.
So in your concrete case: Put the file Module1.pyc directly in the root folder.
As stated below, two steps resolved the issue:
Step 1: Copy the Module.cpython-32.pyc file from .__pycache__ directory to .
Step 2: Rename the file to Module.pyc
PS: Thanks to gecco for sharing the detail.
The problem is that python expects the foo.pyc
files in the same directory as foo.py
. In python3, the .pyc
files have been moved to __pycache__/foo.pyc
(or something similar).
You can compile all .py
files and save them where they should be discovered using compileall
:
python -m compileall -d ../ .
where -d ../
is an argument to save the .pyc
files one level above __pycache__
.
I am using Python 3.2 (both for building and executing), and here is my question.
I intend to ship my python application with the following setup:
There is a main script (say, Main.py
), that is using a compiled module, say Module1.pyc
). To be precise, the directory structure is:
.Main.py
.__pycache__Module1.cpython-32.pyc
When I use the python interpreter to run the main script, it fails to find the module with the following error:
Traceback (most recent call last):
File "Main.py", line 10, in <module>
import Module1
ImportError: No module named Module1
Note that I have added the current directory to PYTHONPATH
environment variable, and is part of sys.path
. Also, the inner __pycache__
directory is also added, and is visible in sys.path
.
Not sure why Module1 is not found. Am guessing, it could be because of the different file name – Module1.cpython-32.pyc? But, then that is how the Python 3.2 interpreter generates it.
Have a look at PEP-3147. They describe how the python-lookup mechanism works.
So in your concrete case: Put the file Module1.pyc directly in the root folder.
As stated below, two steps resolved the issue:
Step 1: Copy the Module.cpython-32.pyc file from .__pycache__ directory to .
Step 2: Rename the file to Module.pyc
PS: Thanks to gecco for sharing the detail.
The problem is that python expects the foo.pyc
files in the same directory as foo.py
. In python3, the .pyc
files have been moved to __pycache__/foo.pyc
(or something similar).
You can compile all .py
files and save them where they should be discovered using compileall
:
python -m compileall -d ../ .
where -d ../
is an argument to save the .pyc
files one level above __pycache__
.