访问被拒错误,与预生成的.pyc或.pyo文件有关
我在尝试通过双击或者命令提示符运行 .pyo 文件时,遇到了一个 访问被拒绝的错误。
假设我有一个 abc.py 文件(里面有主方法入口),它导入了 xyz.py 文件,还导入了 wx 等其他东西。
我生成了 .pyo 文件。但是一旦我尝试运行 abc.pyo,就会出现 访问被拒绝 的错误。
我不明白为什么会这样?任何帮助都非常感谢。
(我使用的是 Windows XP 操作系统)。我是这样从 .py 文件生成 .pyo 文件的。
- 我有一个 .bat 文件叫 CompileAllToPyo.bat,里面的内容是 python -O Compileall.py
- Compileall.py 文件包含以下内容
import os import compileall os.popen3(cmdLine, 'b') compileall.compile_dir('.', force=1)
这就是我所有的信息 谢谢
2 个回答
你不能“运行”一个 .pyo 文件,因为它不是一个可执行的文件。你可以把它当作 .py 文件来给 Python 解释器使用,但一般来说,你应该用 .py 文件作为入口,这样在需要的时候可以重新生成 .pyc 或 .pyo 文件。
$ python imported.pyo
Success!
$ ./imported.pyo
bash: ./imported.pyo: Permission denied
你可以告诉系统你的 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
是一个函数,这样的话,只有当模块作为主脚本运行时,这个函数才会被调用(最好把所有重要的代码放在一个函数里执行,而不是直接放在模块的顶层)。