使用git子模块导入python项目

时间:2013-03-27 20:29:53

标签: python

(我发现StackOverflow上有很多关于python相对导入的问题;我也怀疑我这样做是错的;但无论如何都要这样做..)

我有一个python项目(mysubmod)组织如下:

/__init__.py
/lib
- /__init__py
- /foobar.py
/models
- /__init__.py
- /hello.py

重要的:

  • /models/hello.py导入lib.foobar
  • /models/hello.py有一个块,可以运行一些测试

然后我有第二个项目(myproj),我将mysubmod作为git子模块导入其中; myproj现在按如下方式组织 -

/mysubmod
/scripts
- /__init__.py
- /__test.py

其中:

  • scripts / test.py导入mysubmod.models.hello

然而,当我从命令行运行/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子模块将mysubmod导入myproj,以便它“正常工作”
  • 继续能够独立开发mysubmod(即将脚本作为文件而不是模块运行)

有没有人对如何做到这一点有任何意见?关于git子模块和python的最佳实践的任何观点?

感谢。

2 个答案:

答案 0 :(得分:6)

好的答案是(在许多错误的转弯之后)

  • 添加一个顶级包mysubmod(例如'helloworld')
  • 将mysubmod作为子模块导入myprod,象征性地将helloworld包链接到myprod根目录('ln -s mysubmod / helloworld helloworld')

这样,无论您是将submod作为子模块还是独立工作,都可以维护包结构。

答案 1 :(得分:3)

您还可以添加" mysubmod"启动" myproj"时到sys.path。然后当" mysubmod / models / hello.py"会找到lib.foobar。