代码之家  ›  专栏  ›  技术社区  ›  Benyamin Jafari

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

  •  1
  • Benyamin Jafari  · 技术社区  · 6 年前

    我想使用Python编译运行一个Python项目( .pyc __pycache__ ).为了做到这一点 蟒蛇2 ,我没有任何问题。


    下面是一个简单的示例 蟒蛇2

    • 项目树:

      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')
      

    现在,我想在一个数据库中重试此行为 蟒蛇3 项目

    这是一个简化的例子 asyncio (可在 )项目:

    • 项目树:

      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 这与 subfolder :

      cd test3/__pycache__
      python3 main.cpython-36.pyc
      

      (我原以为这会产生 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内容:

      打印('Hi')
      

    如何运行此项目(如上所述) 蟒蛇3 __pycache__ 文件夹?

    蟒蛇3


    [

    • 我不能用这个 python compileall ( 蟒蛇2 Python3 由于 异步

    • 我的Python版本是 蟒蛇2.7 蟒蛇3.6

    1 回复  |  直到 5 年前
        1
  •  8
  •   ead    4 年前

    您可以使用以下方法在文件夹中强制使用与Python2相同的pyc文件布局:

    python3 -m compileall -b test3
    

    选择权 -b 触发 pyc -将文件保存到其遗留位置(即与Python2中相同)。

    之后,您可以通过以下方式再次使用已编译缓存:

    python3 main.pyc
    

    PEP-3147 ,无法从中使用pyc文件 __pycache__ 按您的意愿设置文件夹:如果没有 *.py -文件的内容 __pycache__ 他从来没有抬头过。以下是工作流中最重要的部分:

       import foo
         |
         |
         -- >  [foo.py exists?]  --- NO ----> [foo.pyc exists?]  -- NO --> [ImportError] 
                |                                     |
                |                                    YES
               YES                                    |--> [load foo.pyc]
                |
                |-> [look up in __pycache__]
    
                                   
    

    也就是说,来自 __pycache__ *白痴 -文件可以找到。


    PEP-3147 .