我有一个特定的问题,可能需要一般解决方案。我目前正在学习 apache thrift 。我使用this指南。我按照所有步骤操作,我收到导入错误,因为无法导入模块UserManager。所以问题是如何进行python导入查找。首先检查哪个目录。它是如何向上移动的?
sys.path.append('')如何运作?
我找到了here的答案。我按照相同的步骤。但我仍然面临同样的问题。有什么想法吗?我应该提出的更多内容可以帮助调试你们。 ?
非常感谢帮助。
答案 0 :(得分:5)
在Windows上,Python从默认python路径中的Lib文件夹中查找模块,例如从“C:\ Python34 \ Lib \”查找。您可以在自定义文件夹(“my-lib”或sth。)中添加Python库,但是您需要一个文件来告诉Python您可以从那里导入。此文件名为 __ init __。py ,并且完全为空。该数据结构应如下所示:
我-LIB
(这是每个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')。