(我发现StackOverflow上有很多关于python相对导入的问题;我也怀疑我这样做是错的;但无论如何都要这样做..)
我有一个python项目(mysubmod)组织如下:
/__init__.py
/lib
- /__init__py
- /foobar.py
/models
- /__init__.py
- /hello.py
重要的:
然后我有第二个项目(myproj),我将mysubmod作为git子模块导入其中; myproj现在按如下方式组织 -
/mysubmod
/scripts
- /__init__.py
- /__test.py
其中:
然而,当我从命令行运行/scripts/test.py时,解释器现在抱怨mysubmod / models / hello.py再也找不到lib.foobar。
刷新。
更改了mysubmod / models / hello.py,现在导入..lib.foobar
现在我可以毫无怨言地运行/scripts/test.py,但我不能再从命令行运行任何submod脚本作为文件;我只能使用python -m选项将它们作为模块运行。
此外,我不能再单独运行submod项目文件,即使使用-m选项,因为解释器会抱怨'尝试相对导入超出toplevel包';我必须上一个目录级别,即只能从myproj根目录运行mysubmod(其中mysubmod作为根级别目录)。
这一切似乎都令人不满意。我希望能够:
有没有人对如何做到这一点有任何意见?关于git子模块和python的最佳实践的任何观点?
感谢。
答案 0 :(得分:6)
好的答案是(在许多错误的转弯之后)
这样,无论您是将submod作为子模块还是独立工作,都可以维护包结构。
答案 1 :(得分:3)
您还可以添加" mysubmod"启动" myproj"时到sys.path。然后当" mysubmod / models / hello.py"会找到lib.foobar。