我想使用Python编译(.pyc或__pycache__)运行Pythonic项目.为了在Python2中做到这一点,我没有任何问题.
以下是Python2项目中的简化示例:
>项目树:
test2
├── main.py
└── subfolder
├── __init__.py
└── sub.py
>编译:
python -m compileall test2
>编译后的项目树:
test2
├── main.py
├── main.pyc
└── subfolder
├── __init__.py
├── __init__.pyc
├── sub.py
└── sub.pyc
>正如您所看到的,手动生成了几个.pyc.现在我可以使用main.pyc运行这个项目,因为它与sub.py有关系:
python main.pyc
日期:
Hi
Bye
> main.py内容:
from subfolder import sub
print('Bye')
> sub.py内容:
print('Hi')
现在我想在Python3项目中重试这种行为.
这是一个简化的asyncio(在Python3中可用)项目:
>项目树:
test3
├── main.py
└── subfolder
├── __init__.py
└── sub.py
>编译:
python3 -m compileall test3
>编译后的项目树:
test3
├── main.py
├── __pycache__
│ └── main.cpython-36.pyc
└── subfolder
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-36.pyc
│ └── sub.cpython-36.pyc
└── sub.py
>如您所见,手动生成__pycache__文件夹.但是我无法使用与子文件夹有关系的main.cpython-36.pyc来运行这个项目:
cd test3/__pycache__
python3 main.cpython-36.pyc
Out(我预计会产生Hi Bye消息):
Traceback (most recent call last):
File "test3/main.py", line 2, in <module>
ModuleNotFoundError: No module named 'subfolder'
> main.py内容:
import asyncio
from subfolder import sub
async def myCoroutine():
print("Bye")
def main():
loop = asyncio.get_event_loop()
loop.run_until_complete(myCoroutine())
loop.close()
main()
> sub.py内容:
print('Hi')
题:
如何使用__pycache__文件夹运行此项目(在Python3项目之上)?
要么
如何使用python编译运行带有子文件夹之间关系的Python3项目?
[注意]:
>由于asyncio方法,我不能在上面的Python3项目中使用python compileall(Python2编译).
>我的Python版本是Python2.7和Python3.6
解决方法:
您可以使用以下命令在文件夹中强制执行与Python2中相同的pyc文件布局:
python3 -m compileall -b test3
选项-b
触发pyc文件输出到其遗留位置(即与Python2中相同).
之后,您可以再次使用已编译的缓存:
python3 main.pyc
从PEP-3147开始加载模块的方式,不可能按照你想要的方式使用__pycache__文件夹中的pyc文件:如果没有* .py文件,__pycache__的内容永远不会被查找.以下是工作流程中最重要的部分:
import foo
|
|
-- > [foo.py exists?] --- NO ----> [foo.pyc exists?] -- NO --> [ImportError]
| |
| YES
YES |--> [load foo.pyc]
|
|-> [look up in __pycache__]
这意味着,只有找到相应的* .py文件时才会查找__pycache__中的文件.