在Python中遇到Import语句问题

时间:2017-05-22 18:28:23

标签: python python-3.x import

我目前的项目结构如此。

python/
    __init__.py
    project_1/
        __init__.py
        program_1.py
    project_2/
        __init__.py
        program_2.py
    project_3/
        __init__.py
        program_3.py

我想从project_1 / program_1.py和project_2 / program_2.py导入一个名为INFO的project_3 / program_3.py中的类。在我的program_1.py和program_2.py中,我尝试了以下无效的导入语句。

编辑 - 我通常" cd"到project_1并从那里运行我的program_1.py。

from project_3.program_3 import INFO

Traceback (most recent call last):
  File "./program_1.py", line 43, in <module>
    from project_3.program_3 import INFO
ImportError: No module named 'project_3'

from python.project_3.program_3 import INFO

Traceback (most recent call last):
  File "./program_1.py", line 43, in <module>
    from python.project_3.program_3 import INFO
ImportError: No module named 'python'

我将类INFO导入program_1.py和program_2.py的唯一方法是在program_1和program_2的文件夹中复制program_3.py。我在program_1和program_2的声明中的导入将变为:

python/
    __init__.py
    project_1/
        __init__.py
        program_1.py
        program_3.py
    project_2/
        __init__.py
        program_2.py
        program_3.py
    project_3/
        __init__.py
        program_3.py

from program_3 import INFO

这非常不方便,因为现在我必须在所有3个位置更新program_3.py。假设我构建项目文件夹的方式是迟钝的:

  • 构建文件夹的正确/最佳方式是什么,以便我可以从program_1 / 2.py调用program_3.py?
  • 如果我当前的结构没有问题,我该如何正确地将INFO类导入program_1 / 2.py?

我已阅读python documentation但它没有说明将一个子文件夹中的类导入到另一个子文件夹中。我还查看了Stack Overflow中的另一个post,但它没有和我的结构相同。

更新1 - 请注意,我只是使用project_1 / 2作为文件夹来组织我的项目,这一点非常重要。我最初在所有文件夹中都有 init .py,因为我不知道我在做什么。我想在project_1 / program_1.py中导入的唯一模块/包来自project_3 / program_3.py。例如:

python/
    project_1/
        program_1.py
    project_2/
        program_2.py
    project_3/
        __init__.py
        program_3.py

2 个答案:

答案 0 :(得分:1)

使用子模块时,需要使用相对导入。在提供的示例中,从library(geosphere) library(data.table) # asumming your dataframe is named "d" d <- data.table(d) # CALCULATE DISTANCE (dist) TO EACH ID (dist_to) for (i in 1:nrow(d)) { print (d[i,]$id) for (j in 1:nrow(d)) { d1 <- d[id == d[i,]$id, dist:=distm(c(d[i,]$lon, d[i,]$lat), c(d[j,]$lon, d[j,]$lat), fun = distHaversine)/1000, ] d1 <- d1[, dist_to:= d[j,]$id,] if(exists('d2')){ d2<-rbindlist(list(d2,d1))} else {d2<-copy(d1)} } } head(d) id lat lon dist dist_to 1: a 51.50549 -0.0924609 0.000000 a 2: b 37.80248 -122.4166340 8623.657407 a 3: c 51.50609 -0.1238904 0.000000 a 4: a 51.50549 -0.0924609 8625.195873 b 5: b 37.80248 -122.4166340 8623.657407 b 6: c 51.50609 -0.1238904 0.000000 b # SELECT DISTANCES LESS THAN 500kms d[dist <= 500,] id lat lon dist dist_to 1: a 51.50549 -0.0924609 2.178749 c 2: c 51.50609 -0.1238904 0.000000 c 导入program_3应为:

program_1

然后您可以使用from ..project_3 import program_3 类:INFO

如果您的可执行文件在脚本之外,那么这是有效的,即在示例中使用模块program_3.INFO的文件应该在python模块之外。

如果python包的某些部分作为脚本执行,则应将python选项传递给解释器:

-m

我希望这会有所帮助。

答案 1 :(得分:0)

之前的解决方案为我提供了同样的错误。

我使用sys:

找到了修复
import sys
sys.path.append('../')

from project_3 import program_3
...

这样,你设置'python'文件夹作为参考(在你的情况下,它是父文件夹,但你可以选择你想要的路径)

我希望它有所帮助,