访问被拒错误,与预生成的.pyc或.pyo文件有关

2 投票
2 回答
2623 浏览
提问于 2025-04-15 20:53

我在尝试通过双击或者命令提示符运行 .pyo 文件时,遇到了一个 访问被拒绝的错误

假设我有一个 abc.py 文件(里面有主方法入口),它导入了 xyz.py 文件,还导入了 wx 等其他东西。

我生成了 .pyo 文件。但是一旦我尝试运行 abc.pyo,就会出现 访问被拒绝 的错误。

我不明白为什么会这样?任何帮助都非常感谢。

(我使用的是 Windows XP 操作系统)。我是这样从 .py 文件生成 .pyo 文件的。

  1. 我有一个 .bat 文件叫 CompileAllToPyo.bat,里面的内容是 python -O Compileall.py
  2. Compileall.py 文件包含以下内容

import os import compileall os.popen3(cmdLine, 'b') compileall.compile_dir('.', force=1)

这就是我所有的信息 谢谢

2 个回答

1

你不能“运行”一个 .pyo 文件,因为它不是一个可执行的文件。你可以把它当作 .py 文件来给 Python 解释器使用,但一般来说,你应该用 .py 文件作为入口,这样在需要的时候可以重新生成 .pyc 或 .pyo 文件。

$ python imported.pyo
Success!
$ ./imported.pyo
bash: ./imported.pyo: Permission denied
2

你可以告诉系统你的 hw.pyo 文件是“可执行的”,比如在 Linux、MacOSX 或其他类似 Unix 的系统中,可以在终端输入命令 chmod +w hw.pyo 来实现。下面是一个简单的终端操作示例:

$ cat >hw.py
print('hello world')
$ python2.5 -O -c'import hw'
hello world
$ ./hw.pyo
bash: ./hw.pyo: Permission denied
$ chmod +x hw.pyo
$ ./hw.pyo
hello world
$ 

默认情况下,.pyo(和 .pyc)文件并不是标记为可执行的,因为它们主要是用来被导入的,而不是直接执行的(实际上,我们是通过 Python 的 import 语句来创建 .pyo 文件的!);不过,正如这个例子所示,让它们“作为主脚本可执行”其实很简单。顺便提一下:

$ cat >hw.py
print('hello world from ' + __name__)
$ python2.5 -O -c'import hw'
hello world from hw
$ chmod +x hw.pyo
$ ./hw.pyo
hello world from __main__
$ 

__name__ 是用来告诉模块它是被 import 进来的(所以第一个“hello world”显示的是“来自 hw”)还是作为主脚本运行的(所以第二个显示的是“来自 __main__”)。这就是为什么那些设计成可以两种方式使用的模块通常会以 if __name__ == '__main__': main() 这样的方式结束,其中 main 是一个函数,这样的话,只有当模块作为主脚本运行时,这个函数才会被调用(最好把所有重要的代码放在一个函数里执行,而不是直接放在模块的顶层)。

撰写回答