如何解决python中的导入错误?

时间:2015-05-26 10:34:45

标签: python import thrift

我有一个特定的问题,可能需要一般解决方案。我目前正在学习 apache thrift 。我使用this指南。我按照所有步骤操作,我收到导入错误,因为无法导入模块UserManager。所以问题是如何进行python导入查找。首先检查哪个目录。它是如何向上移动的?
sys.path.append('')如何运作?

我找到了here的答案。我按照相同的步骤。但我仍然面临同样的问题。有什么想法吗?我应该提出的更多内容可以帮助调试你们。 ?

非常感谢帮助。

4 个答案:

答案 0 :(得分:5)

在Windows上,Python从默认python路径中的Lib文件夹中查找模块,例如从“C:\ Python34 \ Lib \”查找。您可以在自定义文件夹(“my-lib”或sth。)中添加Python库,但是您需要一个文件来告诉Python您可以从那里导入。此文件名为 __ init __。py ,并且完全为空。该数据结构应如下所示:

我-LIB

  • __初始化__。PY
  • / MyFolder文件
  • mymodule.py

    (这是每个Python模块的工作方式。例如urllib.request,它位于“%PYTHONPATH%\ Lib \ urllib \ request.py”)

    您可以通过输入

    从“mymodule.py”文件导入
    import my-lib
    

    然后使用

    mylib.mymodule.myfunction
    

    或者您可以使用

    from my-lib import mymodule
    

    然后只使用你的名字。

    现在可以使用sys.path.append将传递给函数的路径追加到Python查找模块的文件夹中(请注意,这不是永久性的)。如果模块的路径应该是静态的,则应考虑将它们放在Lib文件夹中。如果该路径是相对于您的文件,您可以查找您执行的文件的路径,然后附加相对于您的文件的sys.path,但我建议使用相对导入。

    如果您考虑这样做,我建议您阅读文档,您可以在此处执行此操作:https://docs.python.org/3/reference/import.html#submodules

  • 答案 1 :(得分:1)

    如果我说得对,那你就是从Blender使用Python 3.3但是试图包含3.2标准库。这肯定会给你一系列问题,你不应该这样做。找另一种方式。 Blender很可能提供了一种使用3.3标准库的方法(并且这与99%的兼容性为99)。当然,可以通过摆弄sys.path来包含纯Python第三方库。

    您现在看到的具体问题可能是版本差异造成的。正如人们在评论中指出的那样,Python 3.3没有找到_tkinter扩展模块。虽然它存在(因为它适用于Python 3.2),但很可能是在带有ABI标签的.so文件中,它与Blender的Python 3.3不兼容,因此它甚至不会看到它(很像一个module.txt不考虑导入模块)。这是一件好事。扩展模块是高度版本特定的,轻微的ABI不匹配(例如3.2和3.3之间,或两个3.3使用不同的选项编译)可能导致几乎任何类型的错误,从崩溃到内存泄漏到无声数据损坏甚至是完全不同的东西

    您可以通过import _tkinter验证是否是这种情况;在3.2 shell中打印(_tkinter。文件)。或者,_tkinter可以完全位于不同的目录中。添加该目录实际上无法解决上述实际问题。

    答案 2 :(得分:1)

    对于任何出现问题的新读者,请尝试以下操作。如果您的应用程序目录由 .py 文件构成,这些文件包含用于导入下面导入这些文件的脚本的函数,则这比使用 sys.path.append 更简洁。让我举例说明。

    导入文件的脚本:main.py

    函数文件命名为:func1.py

    main.py
       /functionfolder
          __init__.py
          func1.py
          func2.py
    

    您的 main.py 文件中的导入代码应如下所示:

    from functionfolder import func1
    from functionfolder import func2
    

    正如 Agilix 正确所述,您的“函数文件夹”中必须有一个 __init__.py 文件(请参阅上面的目录图)。

    此外,这解决了我的问题,Pylance 无法解决导入问题,并不断向我显示一个烦人的错误。在仔细筛选 GitHub 问题并尝试了太多相对复杂的建议解决方案之后,这个非常简单的解决方案对我有用。

    答案 3 :(得分:0)

    在包含任何IMPORT语句之前,您可以尝试声明sys.path.append(' / path / to / lib / python')。