簡體   English   中英

從共享全局變量的另一個python文件運行推薦序列的最佳方法是什么?

[英]What's the best way to run a sequence of commend from another python file with global variables shared?

上下文:我正在嘗試將代碼從Matlab遷移到python。 在matlab中,如果您將兩個文件放在同一文件夾下,則只需鍵入文件名即可運行其他腳本中的推薦行或功能。 即在file1.m中,如果我鍵入file2.m,它將自動運行file2.m中的所有代碼行,並且在同一工作空間中共享全局變量。

我試圖在python中做類似的事情。 但是,即使在線閱讀了這些帖子,我仍然有些困惑。

相關文章:

來自:

從另一個python腳本運行python腳本,並傳入args

從另一個腳本調用一個腳本的最佳方法是什么?

subprocess.Popen和os.system之間的區別

使用子進程在python腳本中輸入內容來調用python腳本

因此,我有以下選擇,每個選項似乎都有其獨特的優勢,但是這些帖子之間沒有進行清晰的比較。

import 
os.system
os.popen()
subprocess.Popen()
subprocess.call()
execfile

或簡單地

exec(open(dir+'\\a.py').read())
print(x) #outputs 1

我需要它工作的方式是讓let file2.py在file1.py中使用相同的變量,並且file2.py生成的變量可以由file1.py自由讀取,就像在一個文件中運行一系列推薦命令一樣,或在Matlab的同一工作區中運行它。

有人提到execfile無法傳遞參數??? 因此最好的方法是使用os.system,其他一些人也提到子過程比os.system更好,但是我不確定使用子過程是否會不同地影響變量的使用? 也有人使用subprocess.Propen(),有人使用subprocess.call()。 但是我的樣子,exec(open(dir +'\\ a.py')。read())似乎是我正在考慮的最接近的方法。

我應該使用哪一個,為什么會更好?

您能否在基本情況下制作“目錄”或表格,我應該使用哪種類型的情況?

Python的方式是將file2.m放入模塊中 ,然后將其導入到file1中。 因此,file2中的所有功能都在file1中可用。 如果file2.m包含直接執行的代碼(而不是僅提供某些函數),則該代碼也應被制成一個函數。

不要堅持使用Matlab的全局變量ansatz。 這在Python中是非常糟糕的形式。 習慣了Python方式后,您會發現它笨拙且不合適。

將來自file2.m的代碼放入一個函數中確實有一個很好的副作用:它迫使您考慮該函數的合適名稱 使用參數而不是全局變量將使數據依賴關系顯式而不是隱式,並且正如PythonZen所說,顯式比隱式更好。

from file2 import *

將使file2中的所有定義在當前文件的名稱空間中可用。

每個人都說不要這樣做是有充分理由的。 但這可能是您所要解決的最簡單,最Python化的解決方案。

正確的方法是認真考慮當前代碼需要了解的關於file2 ,並僅使這些內容可用於導入。 一種常見的封裝技術是定義一個類,然后僅導入該類。

from file2 import FileTwoClass

instance = FileTwoClass()
instance.frobnicate(parameterfile='./params')
for goose in instance.geese(color='green'):
    flaps = instance.flaps(goose)
    instance.hovercraft().eject(goose, flaps+1)

如您所見-純屬虛構! -例如,很多功能可以間接地作為對象屬性和方法公開。 理想情況下,根本不應該有任何全局變量-也許是類屬性或單個對象實例列表將成為媒介,但是如果沒有有關代碼的任何詳細信息,就不可能提出任何具體的建議。

暫無
暫無

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

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