我需要獲取python程序中的所有變量,但我不允許運行該程序。然而,我可以通過從主程序調用它並分析局部變量來運行它。在python程序中查找變量列表而不顯式運行程序
回答
ast
是你的朋友。它允許您利用實際的Python解析器,但實際上並不執行解析的代碼。這就是說,這隻會給你一個一階的近似值 - 因爲Python允許動態創建變量,所以靜態分析不能預測所有變量創建的100%。
你不能這樣做。 Python程序中的變量取決於執行路徑。它們都是動態實例化的。例如。
if path == 0:
x = 1
else:
z = 1
w = 2
而且我們假設path
是從文件或用戶讀出的內容。你能指定在執行這個模塊後將定義多少個變量嗎?
更病態的情況下會是這樣的
if path == 0:
locals()['x'] = 1
這將創建一個局部變量x
但它的使用賦值語句,所以你不能使用ast
模塊連追它。
但是,您可以確實從這樣的腳本/模塊/程序中提取變量列表。因此,您將得到一個變量名稱列表,但不保證它們都是該模塊中可訪問的變量,並且不保證它們在腳本的每個位置均已定義。所以「你不能這樣做」並不完全正確。 – Tadeck 2012-03-14 07:45:48
有更多的情況會打破這種情況。我已經更新了我的答案。 – 2012-03-14 09:31:30
+1對於那個棘手的東西,我沒有看到像來自Home Alone 2的壞人那樣來。 – 2012-03-14 10:03:47
如果我錯了,請糾正我,但我會說任何與AST的東西可能矯枉過正在這裏。不是任何出現在賦值語句左側的變量?
這似乎是「變量」是標識符的具體實例,該值可以綁定。在Python執行模型的上下文中,這些被稱爲「對象」,它們被綁定到「名稱」。
如果名稱被綁定在一個塊中,它是該塊的局部變量。 如果名稱在模塊級綁定,它是一個全局變量。 (模塊代碼塊的 變量是本地和全局變量。)如果在代碼塊中使用了一個 變量,但在那裏未定義,則該變量是一個免費的 變量。
下面是甜的東西(我的重點):
下面的構造可以綁定名稱:正式參數到功能, 進口語句,類和函數定義(這些綁定定義塊中的 類別或函數名稱)以及如果在分配中發生 標識符的目標,for循環表頭 的第二個位置除子句標題或之後在與 聲明。來自...的表單的進口聲明import *綁定 在導入的模塊中定義的所有名稱,除了那些以 開頭的下劃線。該表格只能用於模塊級別。
所以,如果你可以覆蓋這些基地,你設置! :)
我假設你用這個分析的任何代碼都是相當簡陋的Python代碼;否則你可能想要如上所述的AST。
不需要。檢查我的答案是否有特別的病理情況。 – 2012-03-14 09:33:31
當然,但我認爲在他的情況下,他可以忽略「pathalogical」情況,例如,他使用返回變量引用列表的函數。無論如何,我知道這在很多語言中通常是一個困難或無法解決的問題;然而,如果您能夠充分約束域,那麼與最困難或無法解決的問題一樣,它變得幾乎微不足道。 – 2012-03-14 10:03:02
同意。雖然,瞭解100%解決方案的不可能性是很好的。 – 2012-03-14 10:18:34
- 1. 在python中運行程序的程序
- 2. Python程序找到列表
- 3. python程序在IDLE中運行不在程序中
- 4. 程序不會在Python龜中運行
- 5. Python程序不運行
- 6. 在OS X中運行進程,查找啓動程序進程
- 7. 更改運行Python程序的全局變量與另一個Python程序
- 8. 嘗試查找列表中的第一個升序運行Python
- 9. 從C++程序運行python程序?
- 10. Python - 查找正在運行的程序文件的路徑
- 11. 在每次運行python程序之前刪除所有變量
- 12. 正在運行Python程序時獲取全局變量
- 13. 產量的Python程序運行
- 14. 執行程序後導入python變量
- 15. 運行python程序的兩種方式
- 16. 查看Java程序運行時變量值的變化?
- 17. 如何在IDE中查找運行時變量列表
- 18. 在線程運行時更改變量而不使用線程[Python]
- 19. IIS 5.1顯示了目錄列表,而不是運行web應用程序
- 20. 在python中運行程序提示
- 21. 在IDLE中運行python程序
- 22. 在Python shell中運行程序
- 23. 運行在內存中的Python程序
- 24. 如何在Python中運行程序。
- 25. 在支架中運行python程序
- 26. 在Windows中運行python程序?
- 27. 在linux上運行GUI應用程序,而不顯示gui?
- 28. 程序在一個java程序中查找方法的數量
- 29. 在程序中運行程序
- 30. 運行程序而不結束它
由於python的動態特性,你只能期待在這個任務中取得部分成功 – 2012-03-14 07:37:57
請注意,在一般情況下,這是不可能的,因爲在Python中,可以動態創建「變量」,而不會在詞彙中出現源文件 – 2012-03-14 07:38:28
您永遠不會完全確定,但作爲一個開始,您可以查看模塊並搜索未包含在類或函數定義中的類「」,「def 」和「 = 」 (所以不在類/函數定義中沒有縮進或縮進)。這是作業嗎? –
Tadeck
2012-03-14 07:39:31