2016-04-14 84 views
0

我需要在我的python项目上执行一个函数的导入。如何在python中从父文件夹导入函数?

我知道有几十个关于SO的类似问题,但不幸的是,我找不到合适的解决方案,因为答案要么太具体问题,要么太笼统,或者他们只是丑陋黑客(如使用绝对路径操作)。

这里是我的文件夹结构看起来像:

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的函数。

我已经尝试了很多方法来执行导入,但不能做到这一点。 我总是要么

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

,当我在我的import语句(即from .hashes.hash_function

使用.或我得到这个:

ImportError: No module named 'hashes'

每个__init__.py文件是空的。

这是我尝试的名单:

  1. from hashes import hash_function

  2. from hashes.hash_function import hash_function

  3. from .hashes.hash_function import hash_function

  4. from ..hashes.hash_function import hash_function

  5. import hashes

  6. import hash_function

  7. from .. import hash_function

  8. from . import hash_function

  9. from PythonClient.hashes.hash_function import hash_function


您能否帮我解决我的问题并了解如何使用此类导入?


PS:该解决方案不能在这里stackoverflow.com/questions/14132789/

+1

我建议你先阅读http://stackoverflow.com/questions/14132789/python-relative-imports-for-the-billionth-time#answer-14132912。如果仔细阅读,可以解决99%的python导入问题。 – laike9m

回答

1

你有一个__init__.py告诉我,PythonClient本身就是一个图书馆的事实发现。做from PythonClient.hashes.hash_function import hash_function。我总是喜欢完全合格的路径。

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

+0

我的根文件夹被称为'PythonClient'。但是,当我从PythonClient.hashes.hash_function导入hash_function''我得到'ImportError:没有名为'PythonClient'的模块 –

+0

它给了我'目录'。'不可安装。没有找到'setup.py'文件。如果我必须创建'setup.py'文件,它应该是什么样的,它应该放在哪里? –

+0

谢谢,创建'setup.py'解决了问题!您能否更新您的答案,以便我可以将其标记为已回答,以便其他人可以看到答案? –

1

我知道你已经接受了一个答案,但是如果你想要一个不太“永久”的解决方案(也就是说,如果你不想要安装你的代码),另一种选择是简单地添加您的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 

干杯!