python2.7包中的多个相对导入

2024-07-02 12:46:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在相对进口方面有很多问题。我将记录下我在其中尝试解决方案的程度,但我仍然无法解决我的问题。你知道吗

我有以下目录结构。这不是我的设计,但我的游戏修改的东西是必要的(分叉回购)。你知道吗

exp
  main_Exp.py
  kaffe
    __init__.py
    tensorflow
      __init__.py
      network_shape.py
  ResNet
    __init__.py    (*)
    ThreeDMM_shape.py

要在本回购协议中运行模型,我将使用

python main_Exp.py input_file.csv

内部main_Exp.py

sys.path.append('./kaffe')
sys.path.append('./ResNet')
from ThreeDMM_shape import ResNet_101 as resnet101_shape
from ThreeDMM_expr import ResNet_101 as resnet101_expr

内部ResNet/ThreeDMM_shape.py

sys.path.append('/home/usc/Desktop/Research/FG18/ExpNet_Code_Release/kaffe/tensorflow')
from network_shape import Network_Shape

很明显,我需要改变这个硬编码的绝对路径。我想做它的正确方式,而不是使用我自己的具体路径,我碰巧安装这些文件。你知道吗


所以我试着

from ..kaffee.tensorflow import Network_Shape

>>> ValueError: Attempted relative import in non-package

(1)我在ResNet文件夹中添加了__init__.py文件(显示为(*)) (2) 我尝试将文件作为模块运行:python -m main_Exp input_file.csv (3) 我还尝试将__init__.py添加到顶层文件夹(exp),尽管我认为这样做是无稽之谈。 (4) 假设第一次导入是使用附加到sys.pathkaffe路径进行的,我尝试将import更改为from .tensorflow.network_shape import Network_Shape

所有步骤后都出现相同错误。你知道吗

所以我不了解有关相对导入的规则以及如何以合理的方式引用文件。我真的很感激一个指针,帮助我了解如何做到这一点,以及如何思考这样的进口一般!你知道吗


Tags: 文件pathfrompyimportinitmaintensorflow
1条回答
网友
1楼 · 发布于 2024-07-02 12:46:11

exp确实不是一个包,即使向其中添加了init文件,也不会成为包,因为这不会神奇地将它添加到python查找包的路径中。如果添加了__init__.py,那么就可以作为python -m exp.main_Exp input_file.csv(从../exp)运行。这将使python将exp识别为包,将kaffe/ResNet识别为子包。您需要将导入更改为from ResNet.ThreeDMM_shape import ResNet_101 as resnet101_shape

编辑以响应comment: 使用m开关从父目录运行是运行脚本的推荐方式,请参见实例https://stackoverflow.com/a/23540051/281545(这适用于python3,但它仍应适用)。如果要避免这种情况(这会破坏硬编码的相对路径),应该将exp添加到sys path(一次就足够了),然后将导入更改为绝对导入,如下所示:

# main_Exp.py
sys.path.append(os.path.abspath(os.path.dirname(__file__))) # the exp folder
from ResNet.ThreeDMM_shape import ResNet_101 as resnet101_shape
from ResNet.ThreeDMM_expr import ResNet_101 as resnet101_expr

# ResNet/ThreeDMM_shape.py
from kaffee.tensorflow import Network_Shape

相关问题 更多 >