如何在Python中从父文件夹导入函数?

7
我需要在我的Python项目中执行一个函数的导入。
我知道在SO上有数十个类似的问题,但不幸的是,我没有找到适合我的正确解决方案,因为答案要么太具体,要么太笼统,要么只是丑陋的hack(例如使用绝对路径操作)。
这是我的文件夹结构的样子:
PythonClient:.
│   .gitignore
│   des.py
│   des_test.py
│   des_var2.py
│   gui.py
│   index.py
│   __init__.py
│
├───diffie_hellman
│   │   diffie_hellman.py
│   │   diffie_hellman_test.py
│   │   __init__.py
│   │
│   └───__pycache__
│           diffie_hellman.cpython-35.pyc
│
├───hashes
│   │   collision.py
│   │   hash_function.py
│   │   __init__.py
│   │
│   └───__pycache__
│           hash_function.cpython-35.pyc
│           __init__.cpython-35.pyc
│
└───__pycache__
        des.cpython-35.pyc
        des_var2.cpython-35.pyc

我需要从./diffie_hellman/diffie_hellman.py导入./hashes/hash_function.py./hashes/hash_function.py文件中只包含一个名为hash_function的函数。
我已经尝试了很多种方法来执行导入,但无法成功。当我在我的导入语句中使用.时(即from .hashes.hash_function),我总是会得到以下错误之一:

SystemError: Parent module '' not loaded, cannot perform relative import

或者我会得到这个:

ImportError: No module named 'hashes'

每个__init__.py文件都是空的。
这是我尝试的列表:
  1. 从哈希函数导入哈希函数

  2. 从哈希函数中的哈希函数导入哈希函数

  3. 从当前文件夹中的哈希函数中导入哈希函数

  4. 从上级文件夹的哈希函数中导入哈希函数

  5. 导入哈希函数

  6. 导入哈希函数

  7. 从上级文件夹中导入哈希函数

  8. 从当前文件夹中导入哈希函数

  9. 从Python客户端中的哈希函数中导入哈希函数


你能帮我解决问题并理解如何使用这样的导入吗?


PS:这里找不到解决方案stackoverflow.com/questions/14132789/


1
我建议您先阅读https://dev59.com/5mYq5IYBdhLWcg3w30Tc。如果您足够仔细地阅读,99%的Python导入问题都可以解决。 - laike9m
2个回答

9

我知道你已经接受了一个答案,但如果你想要一个不太“永久”的解决方案(也就是说,如果你不想要安装你的代码),另一种选择是将你的PythonClient目录的父目录添加到你的路径中。这可以永久性地完成(具体取决于操作系统)或者在代码中暂时实现:

import os
import sys

p = os.path.abspath('../..')
if p not in sys.path:
    sys.path.append(p)

from PythonClient.hashes.hash_function import hash_function

干杯!


3

你有一个__init__.py告诉我PythonClient本身就是一个库。请使用from PythonClient.hashes.hash_function import hash_function导入。我喜欢完全限定路径。

在导入之前,您需要安装您的库。这需要在您的主目录中创建一个setup.py文件。然后,您应该pip安装您的库进行测试,例如,`pip install -e .`。


1
我的根目录名为PythonClient。但是当我执行from PythonClient.hashes.hash_function import hash_function时,我会得到ImportError: No module named 'PythonClient'的错误提示。 - Denis Yakovenko
它给了我目录'.'不可安装。找不到文件'setup.py'。如果我必须创建setup.py文件,它应该是什么样的,应该放在哪里? - Denis Yakovenko
谢谢,创建 setup.py 解决了问题!您能否更新您的答案,这样我就可以将其标记为已回答,其他人也可以看到吗? - Denis Yakovenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接