9

(我意识到 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 选项将它们作为模块运行。

此外,即使使用 -m 选项,我也不能再单独运行 submod 项目文件,因为解释器会抱怨“尝试相对导入超出顶级包”;我必须上一级目录,即只能从 myproj 根目录真正运行 mysubmod(其中 mysubmod 作为根目录)。

这一切似乎都不太令人满意。我希望能够:

  • 使用 git submodule 将 mysubmod 导入 myproj 以便它“正常工作”
  • 继续能够独立开发 mysubmod(即作为文件而不是模块运行脚本)

有没有人对如何做到这一点有任何看法?关于 git submodule 和 python 的最佳实践有什么看法吗?

谢谢。

4

2 回答 2

7

好的答案是(经过许多错误的转弯)

  • 添加单个顶级包 mysubmod(例如“helloworld”)
  • 将 mysubmod 作为子模块导入 myprod,将 helloworld 包符号链接到 myprod 根目录('ln -s mysubmod/helloworld helloworld')

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

于 2013-03-28T07:31:52.017 回答
5

您还可以mysubmodsys.path启动myproj. 然后mysubmod/models/hello.py会发现lib.foobar

于 2014-07-09T12:54:34.737 回答