0

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

我有以下目录结构。这不是我的设计,但我喜欢根据需要修改东西(分叉回购)。

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

要在这个 repo 中运行模型,我将使用

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) 我在文件夹中 添加__init__.py了文件(用 (4) 鉴于第一次导入是使用附加到的路径进行的,我尝试将导入更改为ResNet(*)python -m main_Exp input_file.csv__init__.pyexpkaffesys.pathfrom .tensorflow.network_shape import Network_Shape

所有步骤后出现同样的错误。

所以我不了解相对导入的规则以及如何以理智的方式引用文件。我真的很感激一个指针,它可以帮助我理解如何做到这一点,以及如何考虑一般的此类导入!

4

1 回答 1

1

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等。

编辑以回应评论:使用 m 开关从父目录运行是运行脚本的推荐方式,例如https://stackoverflow.com/a/23540051/281545(这适用于 python 3,但它仍然应该适用) . 如果你想避免它(它会破坏一个硬编码的相对路径)你应该将 exp 添加到 sys 路径(一次可能就足够了)然后将导入更改为绝对路径,如下所示:

# 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
于 2019-03-14T16:10:07.837 回答