当前位置: 首页 > 知识库问答 >
问题:

使用git子模块导入python项目

衡翰藻
2023-03-14

(我意识到在与python相对导入相关的StackOverflow上有很多问题;我也怀疑我做得完全错误;但不管怎样,还是这样吧……)

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

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

重要的是:

  • /models/hello.py导入lib.foobar

然后我有了第二个项目(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选项,因为解释器抱怨'试图相对导入超过顶层包';我必须上升一个目录级别,即只能真正运行mysubmod从myprojroot(其中mysubmod作为根目录)。

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

  • 使用git子模块将mysubmod导入myproj,使其'只是工作'
  • 继续能够在独立的基础上开发mysubmod(即作为文件而不是模块运行脚本

有人对如何做到这一点有什么看法吗?对git子模块和python的最佳实践有什么看法吗?

谢谢

共有2个答案

宗政功
2023-03-14

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

苏骏
2023-03-14

OK答案是(经过多次错误的转弯)

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

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

 类似资料:
  • 我在Pycharm中有一个python项目,其中有一个嵌套的Git子模块。以下是文件夹结构: 中的导入结构如下: 但是,Pycharm没有意识到这一点,而是希望我拥有以下内容: 这是有问题的,因为我不想更改中的所有导入(这似乎不是一个好的实践,也不可扩展),而且中有破折号,这对于导入来说不是有效的Python语法(我无法重命名repo)。 我还需要一种从我的代码中导入的方法。像这样的东西: 但当然

  • 问题内容: 我正在学习Python,但无法弄清楚导入的工作方式。 我从Python教程中了解到该文件初始化了一个程序包,并且可以在此处导入子程序包。 不过,我做错了。您能为我(以及将来的Python学习者)解释我做错了什么吗? 这是我正在尝试做的一个简化示例。 这是我的文件结构: 内容: 是空的。 包含: 最后,包含: 这就是我尝试使用OSX终端和Python 3运行hello_world.py的

  • 我有一个使用git子模块的项目。在我的python文件中,我想在子模块项目中使用另一个python文件中的函数。 为了工作,我必须将init.py文件添加到路径中的所有子文件夹中。我的文件夹树如下: 有没有办法让它在不接触mygitsubmodule的情况下工作? 谢谢

  • 我有一个这样的目录: 我可以这样导入父模块: 那么,既然我已经有了父模块,那么获取子模块的最佳方法是什么?我已经尝试了,,等。 有什么建议吗? 谢谢

  • 问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另

  • 问题内容: 已经使用了平面软件包,我没想到嵌套软件包会遇到这个问题。这是… init .py的内容 这两个和是空的。 内容 内容(3个版本) 版本1 这是导入事物的坏方法和不安全方法(批量导入所有内容),但是它可以工作。 版本2 一种逐项导入的更安全的方法,但是失败了,Python不希望这样:失败,并显示消息:“没有名为模块的模块”。但是…… ……说。所以这是一个模块,但不是一个模块/ -P 8-