如何使用__pycache__文件夹运行Python项目?

我想使用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__中的文件.

上一篇:c – 使用ncurses时对`stdscr’的未定义引用


下一篇:c – 有没有理由不使用链接时优化(LTO)?