Ben*_*ari 3 python cpython compilation pyc python-3.x
我想使用Python编译(.pyc或__pycache__)运行一个Pythonic项目。为了在Python2中做到这一点,我没有任何问题。
这是Python2项目中的简化示例:
项目树:
test2
??? main.py
??? subfolder
??? __init__.py
??? sub.py
Run Code Online (Sandbox Code Playgroud)编译:
python -m compileall test2
Run Code Online (Sandbox Code Playgroud)编译后的项目树:
test2
??? main.py
??? main.pyc
??? subfolder
??? __init__.py
??? __init__.pyc
??? sub.py
??? sub.pyc
Run Code Online (Sandbox Code Playgroud)如您所见,几个.pyc手动生成。现在,我可以正常运行该项目main.pyc,该项目与sub.py:有关系:
python main.pyc
Run Code Online (Sandbox Code Playgroud)
出:
Hi
Bye
Run Code Online (Sandbox Code Playgroud)main.py内容:
from subfolder import sub
print('Bye')
Run Code Online (Sandbox Code Playgroud)sub.py内容:
print('Hi')
Run Code Online (Sandbox Code Playgroud)现在,我想在Python3项目中重试此行为。
这是一个简化的asyncio(在Python3中可用)项目:
项目树:
test3
??? main.py
??? subfolder
??? __init__.py
??? sub.py
Run Code Online (Sandbox Code Playgroud)编译:
python3 -m compileall test3
Run Code Online (Sandbox Code Playgroud)编译后的项目树:
test3
??? main.py
??? __pycache__
? ??? main.cpython-36.pyc
??? subfolder
??? __init__.py
??? __pycache__
? ??? __init__.cpython-36.pyc
? ??? sub.cpython-36.pyc
??? sub.py
Run Code Online (Sandbox Code Playgroud)如您所见,__pycache__文件夹是手动生成的。但是我不能运行与以下项目main.cpython-36.pyc有关系的项目subfolder:
cd test3/__pycache__
python3 main.cpython-36.pyc
Run Code Online (Sandbox Code Playgroud)
退出(我希望产生此Hi Bye消息):
Traceback (most recent call last):
File "test3/main.py", line 2, in <module>
ModuleNotFoundError: No module named 'subfolder'
Run Code Online (Sandbox Code Playgroud)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()
Run Code Online (Sandbox Code Playgroud)sub.py内容:
print('Hi')
Run Code Online (Sandbox Code Playgroud)如何使用文件夹运行该项目(高于Python3项目)__pycache__?
要么
如何使用python编译来运行具有子文件夹之间关系的Python3项目?
[ 注意 ]:
由于该方法,我无法在上述项目中使用python compileall(Python2编译)。Python3asyncio
我的Python版本是Python2.7和Python3.6
您可以使用以下命令在文件夹中强制使用与pyc2相同的pyc文件布局:
python3 -m compileall -b test3
Run Code Online (Sandbox Code Playgroud)
该选项-b将pyc-files 的输出触发到其旧位置(即与Python2中的相同)。
之后,您可以通过以下方式再次使用编译后的缓存:
python3 main.pyc
Run Code Online (Sandbox Code Playgroud)
从PEP-3147开始,模块的加载方式一直存在,因此无法__pycache__按照您希望的方式使用文件夹中的pyc文件:如果没有*.py-file,__pycache__则永远不会查找的内容。这是工作流程中最重要的部分:
import foo
|
|
-- > [foo.py exists?] --- NO ----> [foo.pyc exists?] -- NO --> [ImportError]
| |
| YES
YES |--> [load foo.pyc]
|
|-> [look up in __pycache__]
Run Code Online (Sandbox Code Playgroud)
这意味着,__pycache__只有在*.py可以找到对应的-file 时,才查找from 中的文件。