我的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>的
答案 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)
我发现相对导入和项目布局可能非常棘手!如果您按照这些步骤操作,则应该使其正常工作:
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
为了不使用PYTHONPATH
或sys.path
,您最好将all_recipes/index.py
和simply_recipes/index.py
移动到项目的根目录,并相应地命名。
因此UtilityFunctions
可以随时使用import UtilityFunctions
(顺便说一句,您应该将其命名为utility_functions
)。
另请参阅:Import paths - the right way?
P.S。改变sys.path
有时会导致奇怪的行为。例如,模块可以导入两次。
此外,您必须设置IDE以了解对路径的修改。