python 使用exec的疑惑

2020-09-03 禿頭程式設計師兒

簡介

exec 執行儲存在字符串或文件中的Python語句,相比於 eval,exec可以執行更複雜的 Python 代碼。

exec函數功能強大,也很容易上手,在做未知變量定義時很好用。例如↓

有一個文本文件內容如下:

使用exec函數可以將其中的字符串語句定義為變量:

with open(&34;,&34;,) as f: for line in f.readlines(): exec(line) print(&34;,speed,type(speed))

執行結果:

speed: 20 <class &39;>

簡單方便,看起來和普通定義的變量沒什麼區別。但是,當執行下面這段看似正常的代碼時卻報了錯

def main(): exec(&34;) print(m)main()

報錯信息:

NameError: name &39; is not defined

報錯信息提示m未定義,明明前一行剛用exec定義了m,下面卻報了未定義的錯。修改代碼:

def main(): exec(&34;) fun() print(eval(&34;))main()

此次執行結果正常,說明eval對exec定義的變量能夠正常運行。

修改代碼,將exec函數放在最外層執行:

exec(&34;)def main(): print(m)main()

執行結果正常。

再次修改代碼,將main.m定義為全局變量:

def main(): exec(&34;) print(&34;,main.m)main()

執行結果:

main.m=2

這裡的原因不明。不過根據我的實驗和猜測原因可能與變量的作用域有關,exec定義的局部變量,只能使用eval調用。exec定義的全局變量則可以通用,所以建議在使用exec函數定義變量使,採用全局變量的定義方法。

相關焦點

  • 乾貨 | 深度辨析 Python 的 eval() 與 exec()
    globals 用於指定運行時的全局命名空間,類型是字典,預設時使用的是當前模塊的內置命名空間。locals 指定運行時的局部命名空間,類型是字典,預設時使用 globals 的值。兩者都預設時,則遵循 eval 函數執行時的作用域。值得注意的是,這兩者不代表真正的命名空間,只在運算時起作用,運算後則銷毀。
  • exec執行普通文件和解釋器文件的區別
    編寫一個python文件test.py,文件test.py內容如下:#! /usr/bin/python....如果在命令行方式執行test.py的方式是:test.py -in inputfile -out outputfile;或python test.py -in inputfile -out outputfile;但是因為需要,用exec函數(這裡使用execl)去調用這個python文件。
  • Python中exec()作用域問題詳解
    首先,看一個使用exec的簡單的例子: content = &34;&34;Hello&34;&34; ​ if __name__ == &34;:     exec(content)     print(Tool())這個例子正常地返回了&34
  • Python中eval與exec 的相同點和不同點
    不同點 下面從關鍵字類型、第一個輸入參數、內調 compile 函數 這 3 個方面,討論 eval 和 exec 的不同之處。 1.
  • Mac 上安裝 pyenv 使用多版本python開發項目
    ~ % more ~/.zshrcif command -v pyenv 1>/dev/null 2>&1; then  eval &34;fi重新啟動shell,檢查pyenv 安裝成功~ % exec
  • Windows下ThinkPHP與Linux互通之exec或shell_exec問題
    或者在php中執行 echo exec('whoami') 來查看。centos下默認會是nobody。nobody默認沒有任何權限。此時先自己添加一個用戶和組。sudo不需要輸入密碼四、執行命令到這裡已經可以正常在exec中使用sudo your command來執行命令了!!!!
  • CentOS7安裝Python3.x
    CentOS 7 中默認安裝了 Python,但是版本是2.x的,由於2020年python2.x將停止更新,因此需要將版本升級至3.x。但由於python2.x是系統集成的,很多命令都是要基於python2.x,比如:yum。因此在更新 Python 時,建議新舊版本共存。
  • Python教程:動態變量名定義與調用
    動態變量名賦值 在使用tkinter時需要動態生成變量,如動態生成var1...var10變量 使用exec動態賦值 exec在python3中是內置函數,它支持python代碼的動態執行。
  • 在JavaScript中,使用replace()、test()和exec()方法匹配字符串
    04第四節:exec()方法對於exec()方法,它不是字符串對象的方法,而是在正則表達式對象上使用的方法。exec()方法的功能是用於查找一個字符串是否能在正則表達式中被匹配上,如果匹配上,則返回匹配到的結果,如果未匹配上,則返回null值。
  • 打工人打工魂,打工的必會java調用python的幾種用法
    2.在java中直接調用python腳本在本地的D盤創建一個python腳本,文件名字為javaPythonFile.py,文件內容如下:a = 1b = 2print (a + b)創建JavaPythonFile.java類,內容如下:
  • PHP協程:並發 shell_exec
    在PHP程序中經常需要用shell_exec執行一些命令,而普通的shell_exec是阻塞的,如果命令執行時間過長,那可能會導致進程完全卡住。 在Swoole4協程環境下可以用Co::exec並發地執行很多命令。
  • Python炫技操作:花式導包的八種方法
    使用 execfile在 Python 2 中有一個 execfile 函數,利用它可以用來執行一個文件。語法如下:execfile(filename[, globals[, locals]])參數有這麼幾個:filename:文件名。
  • Sentry中Python SDK 捕捉異常原理
    安裝使用首先安裝sentry-sdkpip install sentry-sdk配置settings.pyimport sentry_sdkfrom sentry_sdk.integrations.celery import
  • Python3.0與Python2.0有哪些區別?
    = 3.關鍵詞加入as 和with,還有True,False,None4.整型除法返回浮點數,要得到整型結果,請使用// 5.2.x和python 3.x中是一致的。注意的是並不是捨棄小數部分,而是執行 floor 操作,如果要截取整數部分,那麼需要使用 math 模塊的 trunc 函數python 3.x:
  • 詳解Python在資料庫測試中的應用
    因此,DM對外提供的基於c/c++的接口都可以通過這個方法得到訪問,如果使用Python作為接口測試的載體,得到的測試用將比使用編譯型語言的測試程序更易於修改調試。  以上是針對c/c++接口而言,對於.net平臺和JAVA平臺,我們可以分別使用Python for .Net 和 Jython。
  • 幾個整蠱的Python程序 自己娛樂就好 勿做其它用途
    使用 pip install pyinstaller。額,使用之後,橡皮擦自己的電腦死機了。pyinstaller 編碼 BUG在使用 pyinstaller 進行打包 exe 的時候,會出現如下錯誤: File "c:\users\administrator\appdata\local\programs\python\python37\lib\site-packages\PyInstaller\utils\hooks\__init__.py"
  • Python の在 VSCode 中使用 IPython Kernel 的方法
    本文介紹,在 VSCode 使用 IPython Kernel,的設置方法。要達到的效果:只需按下 Ctrl+;,選中的幾行代碼,就會自動發送到 IPython Kernel,並運行,得到結果!當然,快捷鍵也可以另行設置!
  • python的虛擬環境:入門
    基於這個位置的exec_prefix,省略了路徑的bin部分。位於sys中的路徑。然後使用前綴通過搜索相對路徑庫/pythonX來定位站點包目錄。X /網站/ X。X是您正在使用的Python版本。在我們的例子中,二進位文件位於/Users/michaelherman/python-virtual-environments/env/bin,即sys。
  • Linux下find與exec的聯手幹大事
    這時候exec命令就派上用場。我們先來看看exec的基本用法。-exec參數後面跟的就是我們想進一步操作的命令,比如rm,mv等等。exec是以分號&34;作為結束標識符的,考慮到各個系統平臺對分號的不同解釋,我們在分號前再加個反斜槓,便於移植。而在分號前,通常也會有一對花括號{},代表前面find命令查找出來的文件各。
  • 初識python
    2,python歷史。宏觀上:python2 與 python3 區別:python2 源碼不標準,混亂,重複代碼太多,python3 統一 標準,去除重複代碼。運行第一個py文件:python3x :python 文件路徑 回車python2x :python2 文件路徑 回車python2 python3 區別:python2默認編碼方式是ascii碼解決方式