【问题标题】:Using git submodule to import a python project使用 git submodule 导入 python 项目
【发布时间】:2013-03-27 20:29:52
【问题描述】:

(我意识到 StackOverflow 上存在很多与 python 相关导入相关的问题;我也怀疑我做错了;但无论如何……)

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

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

重要的是:

  • /models/hello.py 导入 lib.foobar
  • /models/hello.py 有一个运行一些测试的 ma​​in

然后我有第二个项目(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 的最佳实践有什么看法吗?

谢谢。

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,这似乎是一个更好的解决方案。 This answer 提供了一个例子。
      • 在哪里添加sys.path.append("myproject/mysubmod")?我尝试将它添加到myproject/scripts/some_script.py,但是当我执行some_script.py时子模块仍然报告了损坏的导入问题@
      猜你喜欢
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2020-11-26
      • 2021-12-27
      • 1970-01-01
      • 2013-11-06
      • 2010-11-12
      • 2019-03-08
      相关资源
      最近更新 更多