在Python中迭代地调用脚本和脚本之间的变量

时间:2019-01-22 10:04:41

标签: python function variables scripting iteration

我正在尝试对以下脚本进行授权:

  • 读取另一个脚本中定义的输入(例如,Input_01.py或Input_02.py,仅包含变量定义,例如:J = 6或J = 7);和
  • 在函数中使用该变量,即:

    def foo_function():
    
        A = J
        A += 3
        print(A)
    

现在,如果我不需要验证任何东西,那么事情就很简单了: 我只输入from Input_01 import J就是这样。然后,我可以对Input_02进行相同的操作,然后重复该操作。 但是我的想法是制作一个脚本(Multi_Run.py),该脚本使我可以对多次调用关键脚本(称为“ code_foo.py”)的过程进行授权,每个输入文件一个,每次读取一个不同的输入文件(例如Input_01,Input_02等)

这是我当前的“ Multi_Run.py”脚本(仅针对两个不同的输入文件进行了简化):

Inputs = []
for i in range(2):
    Inputs.append("Input_0%s" % (i+1))


for Counter in Inputs:
    import code_foo
    code_foo.foo_function()

但是现在我不能在“ code_foo.py”中说from Counter import J之类的东西,因为这不能工作有两个原因:

  1. 首先,Counter不是code_foo中的变量(通过添加类似from __main__ import *的行似乎可以解决此问题)
  2. 第二,导入功能无法读取Counter变量中的字符串,但它直接需要模块的名称(例如Input_01),从而防止了授权。我试图通过使用importlib.import_module解决此问题,但它似乎无法正常工作(即“ Input _ ##”模块以某种方式“导入”,但没有“运行”,这意味着“ J =#somenumber”行导入脚本时未运行,因此由于未定义J变量而出现错误。

为更清楚起见,我当前的code_foo.py脚本如下:

import importlib


from __main__ import *

importlib.import_module(Counter)


def foo_function():

        A = J
        A += 3
        print(A)

有任何提示吗?非常感谢

1 个答案:

答案 0 :(得分:0)

AFAICT(您的问题仍然很不清楚),看来您这里有两个问题。

第一个关于Python的导入和名称空间。 Python导入不是C或PHP的“包含”,因此导入模块不会使模块中定义的名称直接在导入者的名称空间中可用,您必须使用限定名称(“。”)。另外,Python没有“进程全局”命名空间,Python的“全局”仅对当前模块的命名空间是全局的,因此在模块“ a”中定义全局名称不会使它神奇地用于“模块”导入的模块一种”。这意味着foo_function中的code_foo.py无法直接访问主脚本中定义的名称。

实际上-这是第二个问题-您的问题来自foo_function,具体取决于在其他位置定义的全局名称。这是一个设计错误。通常,不需要全局变量时不要使用全局变量,并且很少需要全局变量。只需编写函数,以便它们将“外部”值作为参数,一切将变得更加简单,并且易于阅读,测试和维护。

在您的情况下,您所需要做的就是1 /重写foo_function(),使其以J作为参数,以及2 /重写multirun,使其得到{{1} },从您的“输入”模块中将其传递给J

foo_function

# code_foo.py

def foo_function(j):
    a = j
    a += 3
    print(a)

请注意:python的命名约定是对模块和变量使用all_lower名称-ALL_CAPS名称用于伪常量。