簡體   English   中英

在 Python 中迭代調用它們之間的腳本和變量

[英]Calling scripts and variables between them iteratively in Python

我正在嘗試自動化一個腳本:

  • 讀取在另一個腳本中定義的輸入(例如 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. 其次,import 函數無法讀取 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)

任何提示? 多謝

AFAICT(您的問題仍然不清楚),看起來您在這里有兩個問題。

第一個是關於 Python 的導入和命名空間。 Python 導入不是 C 或 PHP 的“包含”,因此導入模塊不會使模塊中定義的名稱直接在導入器的命名空間中可用,您必須使用限定名稱(“.”)。 此外,Python 沒有“進程全局”命名空間,Python 的“全局變量”僅對當前模塊的命名空間是全局的,因此在模塊“a”中定義全局名稱並不會使其神奇地可用於模塊導入的模塊“一種”。 這意味着foo_function中的code_foo.py無法直接訪問主腳本中定義的名稱。

實際上 - 這是第二個問題 - 您的問題來自foo_function取決於在別處定義的全局名稱。 這是一個設計錯誤。 作為一般規則,在不需要全局變量時不應使用它們,而且很少需要全局變量。 只需編寫您的函數,以便它們將“外部”值作為參數,一切都會變得更簡單,更易於閱讀、測試和維護。

在您的情況下,您需要做的就是 1/ 重寫foo_function()使其將J作為參數,2/ 重寫multirun以便它從您的“輸入”模塊中獲取J並將其傳遞給foo_function

# code_foo.py

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

# multirun.py

import importlib
import code_foo

def main():
   inputs = ["Input_0%s" % i for i in range(1,3)]

   for modname in inputs:
       module = importlib.import_module(modname)
       j = module.J 
       code_foo.foo_function(j)

if __name__ == "__main__":
    main()

附帶說明:python 的命名約定是對模塊和變量使用 all_lower 名稱 - ALL_CAPS 名稱用於偽常量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM