![](/img/trans.png)
[英]Iteratively creating bash shell scripts with change in variables (in Python?)
[英]Calling scripts and variables between them iteratively in Python
我正在嘗試自動化一個腳本:
在函數中使用該變量,即:
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
,因為這有兩個原因不起作用:
from __main__ import *
這樣的行來解決)為了更清楚,我當前的 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.