【问题标题】:Importing a variable from another script and keeping it updated从另一个脚本导入变量并保持更新
【发布时间】:2015-12-02 09:53:10
【问题描述】:

我有两个 .py 脚本。 script1.py 和 script2.py

我正在从script2.py 导入一些变量,例如:

from script2 import variable1 as var1

效果很好。

但是当我在script2.py 中更新 variable1,然后重新运行script1.py,variable1 的更新不会出现在script1.py 中。为什么呢?

variable1 的更新出现在我完全关闭 IPython 然后再次重新打开 IPython 时。但我不想一直这样做,因为我需要很少的情节才能打开。

我正在使用IPython 1.2.1 和Python 2.7.6(如果可能需要更多信息)。

【问题讨论】:

  • import 此刻获取文件,不检查文件是否稍后检查。因此,您在 script2.py 源文件中更新的任何函数或变量都不会得到更新。您可以使用del var1 删除导入的数据包,然后再次导入,我认为应该可以。如果你必须定期更新你的 script2.py,也许你需要另一种方法,比如将你的变量写入一个配置文件并总是从那里重新加载它。
  • @Memnon:您能否详细说明如何执行您提到的上述解决方案?
  • 你的意思是使用配置文件的方法?

标签: python python-2.7 ipython python-import


【解决方案1】:

有一种方法可以重新加载模块,但它似乎不适用于别名。您可以使用reload(module_name)。正如您将看到的文档指出您的别名不会被刷新:

如果一个模块使用 from ... import ... 从另一个模块导入对象,则为另一个模块调用 reload() 不会重新定义 从它导入的对象——解决这个问题的一种方法是重新执行 from 语句,另一个是使用导入和限定名称 (module.*name*) 代替。

它建议使用

import script2 
script2.variable1

您仍然可以使用别名,但每次都需要刷新别名:

import script2
var1 = script2.variable1

...

reload(script2)
var1 = script2.variable1

如果您不这样做,var1 将保留旧值。

但是,如果您认为有必要(并且经常发生),您可以使用一个快速功能一次性完成所有操作

def reload_script2():
    global var1
    reload(script2)
    var1 = script2.variable1

注意我在这里使用global,以便var1 在全局命名空间中被修改,而不仅仅是在该函数中声明。如果你真的只有一个值,你可以使用return var1,但我认为global 更好的情况很少见。

【讨论】:

  • 所以reload(script2) 应该在Ipython 中还是应该在script1 中?
  • @ThePredator 在 IPython 中,基本上就像再次重新导入模块并覆盖它。
  • @SuperBiasedMan 我做了import nbimporter from importlib import reload import gcoli reload(gcoli),然后想打印一个在 gcoli.ipynb 文件中使用的变量。如何访问变量?使用 gcoli.varname 不起作用。
  • @AjaySinghNegi:如果在gcoli.ipynb 文件中,请尝试使用gcoli.ipynb.varname
【解决方案2】:

对于 ipython,使用 %load 魔法命令:

In [1]: from a import x

In [2]: x
Out[2]: 20

# here go and change the content of a.py

In [3]: from a import x

In [4]: x
Out[4]: 20 # same value

In [5]: %load a.py

In [6]: # %load a.py
x = 22

In [7]: x
Out[7]: 22 # new value

【讨论】:

  • 不,它似乎不起作用!当我在更新variable1 后%load script2.py 时,当我运行script1.py 时,它似乎仍然给出旧值
  • 它只会在ipython解释器中给你新的值(如答案所示),它不会自动更新文件script1.py中的值。
  • 但这就是我想要的!!有办法吗?
【解决方案3】:

如果您必须经常更改变量,我认为将其写入 python 脚本而不是配置文件不是一个好方法。在那里你可以像这样简单地阅读它

def getVar(name):
    c = ConfigParser.SafeConfigParser()
    c.read('config.cfg')
    return c.get('global',name)

虽然变量是这样写在你的config.cfg文件中的:

[global]
var1 = 5
var2 = 10

您也可以将其保存为 JSON,然后使用 json 阅读器而不是配置阅读器。

最后,您可以使用getVar('var1') 获取您的变量,并且它始终是最新的。

【讨论】:

    【解决方案4】:

    将值存储在文件中会更容易。例如,在第一个脚本中,您将拥有:

    myvar = 6
    
    # do stuff
    
    config_file = open('config.txt', 'w')
    config_file.write(myvar)
    config_file.close()
    

    在第二个脚本中,您将拥有:

    config_file_read = open('config.txt', 'r')
    oldvar = int(config_file_read.read()) # you could also do float() (or any type)
    config_file_read.close()
    
    print oldvar
    
    newvar = 5
    config_file_write = open('config.txt', 'w') # this overwrites the contents of the file
    config_file_write.write(str(newvar))
    config_file_write.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-15
      • 2019-03-03
      • 2021-09-27
      • 2023-02-21
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多