2012-07-13 130 views
5

我正在尝试使用python,主要是排除其他人的代码故障。我试图让程序运行,“path\folderA\program.py”。从另一个文件夹导入失败的Python导入

我从path\folderA

运行的程序,我得到一个错误:

ImportError: No module named fff.ggg.ppp 

program.py包含导入:

from fff.ggg.ppp import mmm 

在文件夹 “路径\ FolderB中”有: “path\folderB\fff\__init__.py” “path\folderB\fff\ggg

文件夹ggg还包含__init__.py,以及节目ppp.py

从阅读其他职位,如Python error "ImportError: No module named"据我所知,具有__init__.py使一个文件夹中的“包”,这使得进口成为可能 - 但它不”我工作,因为我得到一个错误。

这一直在为这些项目工作的其他人工作,所以我的设置有问题。

我读了一些关于必须在sys.path中的目录。这是否意味着我必须将它们添加到环境变量路径?这意味着要将大量的目录添加到PATH中,所以它不能。

所以我还发现了以下内容:

import sys 
sys.path.append(<path to FolderB>) 

但是,这意味着改变的代码(这还没有其他人是必要的)和硬编码到它是我的本地机器上的一个路径 - 这我不应该,对吧?

我无法想象它 - 显然我不应该更改代码并将物理路径硬编码到导入模块 - 那么folderA的程序如何知道要在folderB中查找导入?

__init__.py的魔法效果如何?

+1

Python在'PYTHONPATH'环境变量中查找,而不是'PATH' – mgilson 2012-07-13 19:01:43

回答

1

I can't visualize it - apparently I am not supposed to change the code and hard-code the physical path to the import module - so how can a program from folderA even know to look in folderB for an import ?

你是对的。不知何故,你必须告诉python在folderB中查找导入的模块。没有__init__.py魔术可让您从硬盘上的其他文件夹导入。

通常,如果你有各种不同的Python包,它们通过安装到python的库中来工作。这样他们可以从任何地方进口。这通常通过setup.py脚本完成。检查folderB是否有一个。用python setup.py install运行它。

如果这不起作用,我们需要更多关于这个代码结构的信息。

+0

谢谢,我已经看到了setup.py,但不知道如何使用它。有效 ! – Thalia 2012-07-13 19:30:29

0

文件夹B必须位于sys.path中,因此您需要将mmm移动到A或从A中修改sys.path(不确定是否可行)。 __init__.py告诉python该文件夹是一个包,所以你可以在__init__.py的文件夹内有__init__.py的文件夹,并且python把里面的文件夹当作父文件夹的一部分。检查sympy或几乎任何大型的python库,你会发现这样的结构。它也可以包含要在导入时运行的代码,但也可以为空。