【问题标题】:How to change the way a module imports one of its module?如何更改模块导入其模块之一的方式?
【发布时间】:2020-04-17 13:12:18
【问题描述】:

我想知道是否可以将模块导入自己的模块的方式参数化。

我的问题如下。我有许多通用的 tensorflow 函数,例如损失函数,它们适用于 API 的两个版本(1 和 2)。

如果模块是配合TF2使用的,或者配合老版本的TF1,需要像这样导入tensorflow

import tensorflow as tf

但是如果我使用 TF 1.15,或者如果我想使用 TF2 的 API 版本 1,则需要将 tensorflow 导入为

import tensorflow.compat.v1 as tf
tf.disable_v1_behavior()

所以导入的方式不能从TF版本中自动推断出来,因为TF2可以在TF1“兼容”模式下使用。

有没有办法改变模块中的导入方式?

似乎适用于直接导入的模块的 hack:

import my_module
my_module.tf = tf

这会强制tf 模块与当前模块相同。然而,

  1. 这可能会产生不可见且难以跟踪的副作用,因为导入 tensorflow 时可能需要不同的 API,这可能会弄乱任何全局变量设置。

  2. 这适用于直接导入的模块,不适用于由其他模块导入的模块,除非该 hack 传播到所有模块。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    我使用,如https://stackoverflow.com/a/32965521/2069610:

    >>> import pkg_resources
    >>> pkg_resources.get_distribution("tensorflow").version
    'XX.XX'
    

    另一个想法是 grep:

    $ pip freeze | grep tensorflow
    tensorflow==XX.XX
    

    您使用的是 pip 还是 conda?根据conda list 左右的输出,这也可能提供几个不同的选项..

    基于此,您可以使用一种或另一种导入...

    【讨论】:

    • 问题是这不能依赖于 tf 包的版本。我可以安装 TF 2.1 并使用 v1 API。
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2011-08-14
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多