支持使用相同版本的Python同时运行多个Python模块版本。

7

我找了很多地方,但是没有找到对我的问题有清晰回答的地方。

我有一个非常合理的需求,需要支持同一Python模块的N个版本。

如果它们存储在同一个包/目录中,它们必须具有唯一的名称,就像以下示例中所示:

      .../some/package/my_module_1.0.py
      .../some/package/my_module_1.1.py
      .../some/package/my_module_2.0.py
              -- etc. --

每个模块都会通过“version”属性存储其版本号。

然后,消费程序将导入它需要的正确版本(例如:import my_module_1.1)。

这是实现多模块版本需求的最佳(且最符合Python风格的)方式吗?

谢谢!


如果您能使该模块与两个版本兼容,那将是很好的。 - zondo
谢谢。我不确定我理解您的意思。您能详细说明一下吗?此外,请记住可能会有多个版本,而不仅仅是两个(这是有原因的——它与ETL管道有关,但我不想让每个人都感到无聊)。 :) - NYCeyes
我不能确定这是否可能实现,因为我无法看到代码,但如果你写了 my_module_*,你可能能够保持语法与多个版本兼容。例如,在Python2中,except Exception, e:是有效的语法,但在Python3中不是,所以你应该使用except Exception as e:,因为它在两个版本中都是有效的语法。 - zondo
1
哦,亲爱的。不,我不是指需要在不同的Python解释器(如Python 2和3)之间工作的模块。我只是指同一模块的多个版本(比如仅在Python3中为简单起见)。 - NYCeyes
消费程序是否知道它需要哪个版本?如果是这种情况,它只需通过一系列if:else语句选择正确的导入即可。您还可以查看sys.__modules__,其中包含按名称键入的导入模块字典,通常是文件名。您可能能够通过导入正确的模块并始终将其存储在相同的键下来隐藏版本问题,而不管其实际文件名是什么。 - Paul Cornelius
显示剩余2条评论
1个回答

4
我在搜索“flask支持多个API版本”的过程中发现了这个stackoverflow帖子,链接。总的来说,与你提供的方法唯一不同的建议是他们为每个版本使用子目录,并将每个版本作为一个模块。如果你能够共享版本之间的公共函数/对象,那么这种结构可能会使你的模块更容易维护和管理。
some_package
+--- my_module/
     +--- v1_0/
          +--- __init__.py
          +--- some_file.py
     +--- v2_0/
          +--- __init__.py
          +--- some_file.py
     +--- __init__.py
     +--- common_stuff.py

但如果你不能在不同版本之间共享内容,那么你目前的想法就可以正常运行,并且更为简单。

然后你可以像这样导入它:

import my_module.vX_Y as my_module

谢谢@willnx。我看到了你上面的留言。让我想一想/花点时间考虑一下。如果我找不到更好的答案(并不是说你的回答不好),那么我会将其标记为答案。我已经点赞了。 =:)。谢谢。 - NYCeyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接