Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用git子模块导入python项目_Python - Fatal编程技术网

使用git子模块导入python项目

使用git子模块导入python项目,python,Python,(我意识到在与python相对导入相关的StackOverflow上有很多问题;我也怀疑我做得完全错误;但不管怎样,还是这样吧……) 我有一个python项目(mysubmod),组织如下: /__init__.py /lib - /__init__py - /foobar.py /models - /__init__.py - /hello.py 重要的是: /models/hello.py导入lib.foobar /models/hello.py有一个运行一些测试的主块 然后我有了第二

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

我有一个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选项,因为解释器抱怨“试图在顶级包之外进行相对导入”;我必须升级到一个目录级别,即只能从myproj根目录运行mysubmod(其中mysubmod作为根目录)

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

  • 使用git子模块将mysubmod导入myproj,使其“正常工作”
  • 继续能够独立开发mysubmod(即将脚本作为文件而不是模块运行)
有人对如何做到这一点有什么看法吗?关于git子模块和python的最佳实践有什么看法

谢谢。

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

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

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

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

是的,这似乎是一个更好的解决方案。提供了一个示例。