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

2024-10-03 11:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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

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

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

您能告诉我如何从父目录导入python模块,或者如何更改我的项目体系结构,使之不必重复代码(驻留在效用函数.py)?


Tags: 模块文件项目py目录indexinit网站
3条回答

我发现,相对的进口和项目布局可能是相当棘手的获得窍门!如果您遵循以下步骤,您应该让它正常工作:

  • 首先,如果您使用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在您的PYTHONPATH中。在
  • 现在,库中的相对导入应该可以正常工作,例如在all_recipes.index中:

    ^{pr2}$

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

    from Test_Folder import UtilityFunctions
    

但是,如果您只是尝试运行all_recipes.index,那么这个将不起作用。运行脚本时,它需要绝对导入。把它想象成你在写一个库和一个使用这个库的脚本。该库使用相对导入,但不能使用python -m正常运行。您可以像这样运行脚本,但不能使用相对导入。所以你的剧本看起来像

    from Test_Folder.PerformAllIndexing import run
    run()

当您尝试运行单元测试时,这可能会导致问题,因为您并不总是希望运行整个套件。我对测试的建议是在Project Root Folder下的一个单独的tests文件夹中保存,并且只使用绝对导入。使用测试运行程序(如nose)也有帮助。在

只需将Test文件夹添加到python中系统路径所以你可以毫无问题地导入它。在

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

您的项目架构:

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.py和{}移到项目的根目录,并相应地命名它们。在

因此,UtilityFunctions将很容易使用import UtilityFunctions(顺便说一句,您应该将其命名为utility_functions)。在

{a1}另见}

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

相关问题 更多 >