我目前的项目结构如此。
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。假设我构建项目文件夹的方式是迟钝的:
我已阅读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
答案 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'文件夹作为参考(在你的情况下,它是父文件夹,但你可以选择你想要的路径)
我希望它有所帮助,