【问题标题】:I cannot get import random to work- python 3 [duplicate]我无法让导入随机工作-python 3 [重复]
【发布时间】:2014-11-04 18:33:16
【问题描述】:

我写了下面的代码来尝试生成随机数-

import random
def main(): 
   a=random.randint(1,100)
   b=random.randint(1,100) 
   print (a)
   print (b)

main() 

运行程序后,我得到了这样的信息:

文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/random.py”,第 41 行,在模块中

从数学导入日志为_log,exp为_exp,pi为_pi,e为_e,ceil为_ceil

ImportError: 'math' 中的魔数错误:b'\x03\xf3\r\n

【问题讨论】:

  • 您的 Python 安装可能已损坏。
  • 您是否已将 Python 3.4 标准库明确添加到您的 PYTHONPATH 中?然后尝试运行一些不同的 Python(可能是您通过 Homebrew 安装的不同的 3.4,或者可能是 Apple 预装的 2.7)?
  • 删除它并扭转它。 b'\x03\xf3\r\n' 是来自 CPython 2.7 的神奇数字,因此您显然已将一些 Python 2.7 标准库添加到您的 PYTHONPATH 并运行 3.4...
  • 我在“argparse”上得到了错误的幻数,结果发现在我的一个 PYTHONPATH 文件夹中有一个“argparse.pyc”。我不记得我是什么时候以及为什么把它放在那里的,但显然这就是问题所在。

标签: python python-3.x random


【解决方案1】:
ImportError: bad magic number in 'math': b'\x03\xf3\r\n

幻数 b'\x03\xf3\r\n' 表示 Python 2.7。我不知道在哪里可以在线找到,但由于您使用的是 Mac,您可以运行 Apple 预装的 Python2.7 并查看:

$ /usr/bin/python2.7
>>> import imp
>>> imp.get_magic()
'\x03\xf3\r\n'

所以,不知何故,您的sys.path 上有一个 2.7 math.pyc,当然 3.4 无法加载它。


还要注意标准 CPython math 模块,无论是在 2.x 还是 3.x 中,都是一个纯 C 扩展模块——也就是说,它是一个 .so 文件,而不是一个 .py 文件,所以有该模块将没有.pyc。您必须已经编写或下载了一些名为 math.py 的模块,并在某个时候在 Python 2.7 中使用过它。

除非您使用非 CPython 实现,在这种情况下,可以想象在 stdlib 中有一个 math.py。如果你使用的是 PyPy,我怀疑你会知道你在使用它,所以如果你不知道我在说什么,请追溯跳过这一段。


很可能它只是在当前目录或其__pycache__ 中。要找出答案,请执行以下操作:

$ find . -name 'math*.pyc'

如果出现任何问题,那就是问题所在,您必须将其删除。但首先,您可能需要确保您仍然拥有它来自的 math.py 文件,或者不需要它。 (或者如果你不确定,也许只是把它移到别处而不是删除它。)


但是,您也有可能将它安装在不应该在您的 sys.path 上但已安装的某个位置,或者您使用 2.7 将它安装到了应该在您的 3.4 sys.path 而不是您的 @ 上的某个位置987654336@sys.path,但是是。

在 3.4+ 中,当您无法成功 import 并查看模块时,找出模块在哪里的最简单方法是:

>>> import importlib
>>> importlib.util.find_spec('math')
ModuleSpec(name='math', loader=<_frozen_importlib.ExtensionFileLoader object at 0x102e065c0>, origin='/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload/math.so')

你会在某处找到一些名为math.pyc(或math-SOMETHING.pyc)的文件。然后,您需要弄清楚“某处”是否不应该在您的路径上,或者该文件是否不应该在某处。这很可能很明显,因为文件的路径中包含 2.7 或 3.4。

如果你想知道你的路径是什么,只需这样做:

>>> import sys
>>> sys.path

这应该会显示一个路径列表,包括'.'、3.4 标准库、3.4 系统和用户站点包、使用 .pth 文件安装的任何鸡蛋等。它不应包含任何 2.7 或未版本化的内容。

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 2018-05-11
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2011-09-04
    • 2017-07-03
    相关资源
    最近更新 更多