Python无法检测到.pyc文件

4
我将使用Python 3.2(用于构建和执行),以下是我的问题。
我打算使用以下设置来发布我的Python应用程序:
有一个主脚本(例如,Main.py),它正在使用已编译的模块,例如Module1.pyc。准确地说,目录结构如下:
.\Main.py
.\__pycache__\Module1.cpython-32.pyc

当我使用Python解释器运行主脚本时,出现以下错误无法找到模块:
Traceback (most recent call last):
  File "Main.py", line 10, in <module>
    import Module1
ImportError: No module named Module1

请注意,我已将当前目录添加到PYTHONPATH环境变量中,并作为sys.path的一部分。同时,内部的__pycache__目录也被添加到了sys.path中并且可见。
不确定为什么找不到Module1模块。猜测可能是因为文件名不同 - Module1.cpython-32.pyc?但是,这就是Python 3.2解释器生成的方式。

确保你的文件名相同。你最初声明了模块名称为Module1,并从dir结构中显示了这一点。然后你导入了Module并谈论了另一个文件名。因此很难知道是你打错了模块名还是实际上不正确。 - Christian Witts
抱歉,那只是一个打字错误。文件名是一致的。 - Kiran M N
这个回答解决了你的问题吗?如何使用 __pycache__ 文件夹运行 Python 项目?(https://dev59.com/nbDma4cB1Zd3GeqPALSS) - ead
3个回答

13

请查看PEP-3147,其中介绍了python查找机制的工作原理。

enter image description here

因此,在您的具体情况下:直接将文件Module1.pyc放在根文件夹中。


尝试将Module.cpython-32.pyc复制到同一文件夹中,但仍然失败。 现在,因为文件名中有'cpython-32.'作为其中一部分。如果我将文件重命名为Module.pyc,它就可以完美运行。 - Kiran M N
2
虽然这解决了问题,但需要再重命名pyc文件一步。 有没有办法控制创建的pyc文件名? - Kiran M N
看一下 compileall 模块,这可能是你要找的东西... (compileall.compile_dir) - gecco

4
如下所述,两个步骤解决了问题: 步骤1:将Module.cpython-32.pyc文件从.__pycache__目录复制到.\目录中。 步骤2:将文件重命名为Module.pyc。
PS:感谢gecco分享细节。

提示:你的回答并没有回答问题(为什么找不到pyc):这样的回答可能会被严厉的SO用户投票否决... - gecco
2
@gecco,解决这个问题需要两个步骤,我已经提到了。除非两个步骤都执行,否则它不起作用。 您分享的流程图涉及第一步。 所以,不确定为什么会被投票降低。因为我刚刚尝试过,并发现需要执行两个步骤才能使其正常工作。 - Kiran M N
据我所看,您的问题并没有问如何从./__pycache__/Module.cpython-32.py到达./Module.pyc。您问的是为什么它不起作用以及如何修复它:这两个答案都在我的回答中提供了... - gecco

0

这个问题可能取决于您使用的Python版本,因为多年来构建/编译/打包系统已经发生了变化。

对于Python 3.9,我发现这个命令有效:

# recursively compile all modules
python -m compileall -b .

# run the compiled version of your `Main.py`
python Main.pyc

解释

主要问题是在最近的Python版本中,/package_dir/my_module.py被编译为/package_dir/__pycache__/my_module.cpython-64.pyc(或某些变体)。模块发现系统显然不会查找__pycache__,导致在my_module导入语句处出现module not found错误。-b标志告诉编译器将编译文件写入与源.py文件相同的位置,因此它们可以被发现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接