需要帮助来了解有关Python中相对导入和绝对导入的问题

时间:2018-07-25 03:33:44

标签: python import python-import

当我想在特定文件夹中安装某个Python软件包(使用pip install -t),然后从该软件包导入模块时,出现错误。

我将问题发布在软件包的Github上,结果证明我无法在特定文件夹中安装软件包;不支持以这种方式安装软件包。

  

即使没有google合作,我也可以尝试使用pip install -t sklearnFolder在某些特定文件夹中安装sklearn,然后将其作为sklearnFolder.sklearn.manifold导入时重现导入错误。

     

这不是安装/使用scikit-lean的受支持方法。之所以不起作用的原因之一是scikit-learn中的一些模块使用了绝对导入(例如从sklearn导入某些内容),但这种设置会失败。

     

您应该使用pip install进行安装,或者如果您希望将其安装在某个特定文件夹中,则将存储库克隆到该文件夹​​,然后运行pip install -e,在两种情况下,它都将作为sklearn导入。

来自https://github.com/scikit-learn/scikit-learn/issues/11656

我不太理解。

我想过

from folderName.package import module

相同
from package import module

因为它们都是绝对进口。与之相同,它们都完全指定了导入模块的路径。因此,我的理解有些不足,但我不知道这是什么。

1 个答案:

答案 0 :(得分:1)

在导入中,您没有指定folderName作为包的前缀。如果软件包已安装或在python路径中,则只需使用软件包名称进行导入。

    # Assume the below structure is under a directory (folder) called /app/home/packages.

    reservation/                  This is your top-level pacakge 
        __init__.py               Initialize the package
        hotels/                   Subpackage for hotel reservations
            __init__.py
            slots.py
            bid.py
            demand.py
            ...
            restaurents/                  Another Subpackage under hotels 
                __init__.py
                cuisine.py
                hours.py
                tableslots.py
                ...
        rewards/                      Subpackage for rewards
            __init__.py
            points.py
            discounts.py
            membersonly.py
            ...

由于软件包位于/ app / home / packages下,因此以下导入无效,因为您为文件夹名称加上前缀。

    from packages.reservation import hotels 

正确的导入方法是从实际的软件包中进行初始化的__init__.py软件包。如果在示例中看到,则保留文件夹具有__init__.py。

    from reservation import hotels 

如果要导入酒店下的子模块,则将在该包之前添加前缀:

   from reservation.hotels import restaurents

或者,您可以直接导入子模块,但是在使用时必须在包之前加上前缀:

   import reservation.hotels.restaurents