Python项目问题:从父文件夹导入或更改项目体系结构

时间:2012-03-18 05:25:14

标签: python architecture project software-design

我的Python项目有问题。我的项目为每个食谱分析不同的食谱网站,并将食谱数据写入文本文件。

我的问题:我无法导入驻留在父目录中的python文件/模块。此文件包含解析网页的通用函数。当我这样做时出现错误:“ValueError:在非包装中尝试相对导入”

我的解决方案:我不知道我的解决方案是什么?我想我要么找到一种从父目录导入文件的方法,要么改变我的项目架构,以便每个域解析脚本都位于同一目录中

项目架构:

Test Folder:  
    __init__.py   
    UtilityFunctions.py     # the file I am importing  
    PerformAllIndexing.py 
    all_recipes:
        __init__.py
        index.py            # imports ../UtilityFunctions.py
    simply_recipes:
       __init__.py
        index.py            # imports ../UtilityFunctions.py

每个子目录都包含一个名为 index.py 的文件,该文件可以提取特定网站的配方名称,成分和方向,并将其写入文本文件。

我鼓励您下载我的项目以详细了解我的问题:http://www.mediafire.com/?ynup22oe8ofam21

你能告诉我如何从父目录导入python模块或者如何更改我的项目架构以使其工作而不需要重复代码(代码驻留在UtilityFunctions.py中)? / em>的

3 个答案:

答案 0 :(得分:2)

只需将测试文件夹添加到python sys.path中,这样就可以毫无问题地导入它。

import sys
# Add the Test Folder path to the sys.path list
sys.path.append('/path/to/test/folder/')

# Now you can import your module
from test_folder import UtilityFunctions

答案 1 :(得分:1)

我发现相对导入和项目布局可能非常棘手!如果您按照这些步骤操作,则应该使其正常工作:

  • 首先,如果你正在使用python< 2.5确保你有from __future__ import relative_imports
  • 然后,为了简单起见,您需要这种布局

    Project Root Folder:
        Test_Folder:  
            __init__.py   
            UtilityFunctions.py 
            PerformAllIndexing.py 
            all_recipes:
                __init__.py
                index.py
            simply_recipes:
                __init__.py
                index.py
    

    请注意__init__中没有Project Root Folder

  • 然后,您需要确保Project Root Folder中有PYTHONPATH
  • 现在,您图书馆内的相对导入应该可以正常工作,例如在all_recipes.index内:

    from .. import UtilityFunctions
    

    和绝对导入从Test Folder开始,例如

    from Test_Folder import UtilityFunctions
    

但是,如果你只是尝试运行all_recipes.index 将无法正常工作。运行脚本时,它需要绝对导入。您可以将其视为编写库和使用该库的脚本。该库使用相对导入,但您无法使用python -m正常运行它。您可以像这样运行脚本,但不能使用相对导入。所以你的脚本可能看起来像

    from Test_Folder.PerformAllIndexing import run
    run()

当您尝试运行单元测试时,这可能会导致问题,因为您并不总是希望运行整个套件。我对测试的建议是将tests文件夹保存在Project Root Folder下,并且仅使用绝对导入。它还有助于使用nose等测试运行器。

答案 2 :(得分:0)

您的项目架构:

Test Folder:  
    __init__.py   
    UtilityFunctions.py     # the file I am importing  
    PerformAllIndexing.py 
    all_recipes:
        __init__.py
        index.py            # imports ../UtilityFunctions.py
    simply_recipes:
       __init__.py
        index.py            # imports ../UtilityFunctions.py

为了不使用PYTHONPATHsys.path,您最好将all_recipes/index.pysimply_recipes/index.py移动到项目的根目录,并相应地命名。

因此UtilityFunctions可以随时使用import UtilityFunctions(顺便说一句,您应该将其命名为utility_functions)。

另请参阅:Import paths - the right way?

P.S。改变sys.path有时会导致奇怪的行为。例如,模块可以导入两次。 此外,您必须设置IDE以了解对路径的修改。