我知道在相对进口方面有很多问题。我将记录下我在其中尝试解决方案的程度,但我仍然无法解决我的问题。你知道吗
我有以下目录结构。这不是我的设计,但我的游戏修改的东西是必要的(分叉回购)。你知道吗
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.path
的kaffe
路径进行的,我尝试将import更改为from .tensorflow.network_shape import Network_Shape
所有步骤后都出现相同错误。你知道吗
所以我不了解有关相对导入的规则以及如何以合理的方式引用文件。我真的很感激一个指针,帮助我了解如何做到这一点,以及如何思考这样的进口一般!你知道吗
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(一次就足够了),然后将导入更改为绝对导入,如下所示:
相关问题 更多 >
编程相关推荐