Python 板


LINE

汝題,小弟有個研究目前卡在一個小地方,就是小弟目前是希望每個 import 的 module 都能先經過某一些修改操作之後再執行 (import),但是小弟遍嘗試了網路上的各種宣稱 能模擬內建找尋 module 的方法之後都還是有些缺陷,所以想請問專業的各位, 我是想覆寫內建的 builtins.__import__ 方法,在執行之前先攔截系統幫我們找好的 module,我修改之後再執行,簡單來說不要讓這個 module 被執行兩遍,該如何做? 因為事關研究,如果嘗試了解答者的做法之後確實成功,我會給予至少 3000P 以上的 高額酬勞。穴穴大家! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.16.166 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1596620348.A.3BF.html
1F:推 ddavid: 試試參考這篇下面回答的做法?據回答者所說,限定Python 08/05 19:25
2F:→ ddavid: 3.5+。 08/05 19:25
3F:→ ddavid: https://bit.ly/33uEGv6 08/05 19:25
4F:→ ddavid: 不過我沒聽很懂你所謂不要執行兩次的意思,原本import機 08/05 19:27
5F:→ ddavid: 制就有擋重複載入,如果上面方法不合你需求那可能問題要 08/05 19:27
6F:→ ddavid: 更明確給個例子 08/05 19:27
7F:推 ddavid: 你說找過某些方法都有缺陷,那也應該簡單講一下找到的方 08/05 19:32
8F:→ ddavid: 法跟不合你用的地方在哪,不然到時大家一直回都是你找過 08/05 19:32
9F:→ ddavid: 不合用的方法,豈不浪費彼此時間XD 08/05 19:32
10F:→ alan23273850: 這篇我當然是看過的了XD 就是因為裡面的做法在某些 08/05 21:12
11F:→ alan23273850: 媽九就是找不到,但內建的__import__卻又可以,我才 08/05 21:12
12F:→ alan23273850: 覺得很怪,之所以說不要兩次是因為我目前是直接先 08/05 21:13
13F:→ alan23273850: 執行內建import,修改之後再執行一次,總共兩遍, 08/05 21:13
14F:→ alan23273850: 但是某些沒有source的module因為不能修改就只執行一 08/05 21:13
15F:→ alan23273850: 次,這樣疑似造成某個媽九會有circular import問題 08/05 21:14
16F:→ alan23273850: 才想問問有沒有其他作法,就是找法要跟內建的import 08/05 21:14
17F:→ alan23273850: 一模一樣的才行,我知道這個問題很難XD 08/05 21:14
18F:→ alan23273850: 而且你想想看,理論上本來不就是應該要提供使用者和 08/05 21:15
19F:→ alan23273850: 內建找法一樣的function供使用才方便嗎? 08/05 21:15
20F:→ alan23273850: 堂堂我大Python竟然連這點小功能都提供不出來像話嗎 08/05 21:16
21F:推 TuCH: 不知道這個理論上是什麼理論? 有其他程式語言有提供這樣的功 08/05 21:41
22F:→ TuCH: 能嗎 08/05 21:41
23F:推 TuCH: 要跟內建找法一樣的function 不是很懂 可以講詳細一點嗎 08/05 21:57
24F:→ TuCH: 也說說你是哪個模組出問題 這樣研究起來比較快 08/05 21:58
25F:推 ddavid: 沒這種理論吧,有些語言是直接根本沒有所謂的內建module啊 08/06 09:52
26F:推 ddavid: ,或是許多不支持Implicit declaration of functions皆如 08/06 09:58
27F:→ ddavid: 此 08/06 09:58
28F:推 ddavid: 老實說,除了少數Python完全不用import就能call的東西以外 08/06 10:18
29F:→ ddavid: ,其他不是大不了你就不要安裝,完全寫一個同名module就搞 08/06 10:19
30F:→ ddavid: 定了嗎 08/06 10:19
31F:→ ddavid: 我覺得你還是得直接給出一個實例,不然根本搞不懂真正的問 08/06 10:20
32F:→ ddavid: 題在哪,弄半天大家都困在XY Problem裡面浪費時間 08/06 10:20
33F:推 ddavid: 而且也看不出「找法要跟原本一模一樣」的意思或必要性 08/06 10:26
34F:→ ddavid: 而一般會造成circular import的根本理由是程式架構出了問 08/06 10:28
35F:→ ddavid: 題,在你的說明裡面也看不出為啥會需要發生交叉import XD 08/06 10:29
36F:→ alan23273850: 好吧,可能我的發問不夠清楚,但是重新敘述又會很花 08/06 11:49
37F:→ alan23273850: 時間,這個問題我先自己再看看官網,如果到時候能切 08/06 11:49
38F:→ alan23273850: 成更小塊的話我會再回文發問的 08/06 11:49
39F:推 TuCH: 修改底層很抖耶 不打算用任何套件? 08/06 13:47
40F:→ alan23273850: 簡單來說,我就只是希望我找得到module<==>內建方法 08/06 15:50
41F:→ alan23273850: 也找得到那個module,這樣而已,官方文件有提供 08/06 15:50
42F:→ alan23273850: importlib.util.find_spec(,)這個函式,不過他必須 08/06 15:51
43F:→ alan23273850: 要提供兩個參數,第二個是base path,我看內建的 08/06 15:51
44F:→ alan23273850: __import__沒有這種參數,才覺得怪,不然用find_spe 08/06 15:51
45F:→ alan23273850: c就好了 08/06 15:52
46F:→ alan23273850: 為什麼內建的__import__就不用提供find_spec的二參 08/06 16:14
47F:→ alan23273850: 我似乎快找到答案... 08/06 16:16
48F:推 ddavid: 內建的本來就不需要參數啊?因為它會從current directory 08/06 16:32
49F:→ ddavid: 、PYTHONPATH環境變數指定的目錄、Python安裝目錄去找 08/06 16:33
50F:→ alan23273850: https://imgur.com/zrQXpPl 我現在想知道用內建的 08/06 16:39
51F:→ alan23273850: __import__和我手動呼叫的find_spec回傳的結果差異 08/06 16:39
52F:→ alan23273850: Case1 相同:https://imgur.com/Lf7p57c 08/06 16:40
53F:→ alan23273850: Case2 相異:https://imgur.com/2WUmgFI 08/06 16:41
54F:→ alan23273850: 我現在不解的就是這個 Case 2,它用內建__import__ 08/06 16:42
55F:→ alan23273850: 是只會回傳最高級的package,這個它官網上有寫,但 08/06 16:42
56F:→ alan23273850: 是Case1和Case2的name給法都是有包含.的,那為什麼 08/06 16:42
57F:→ alan23273850: 會有差異?這我真的就不懂,才造成無法靈活地用find 08/06 16:43
58F:→ alan23273850: _spec去取代內建__import__ 08/06 16:43
59F:→ alan23273850: 好像是跟 fromlist 是不是空的有關 08/06 17:15
60F:→ alan23273850: 如果我最後有試出來我要的解答的話會回饋給板上的 08/06 17:17
61F:→ AndCycle: "Why does Python's __import__ require fromlist?" 08/06 18:04
62F:→ alan23273850: __import__(name, globals=None, locals=None, 08/06 18:17
63F:→ alan23273850: fromlist=(), level=0): blablabla 它給的標準格式 08/06 18:18
64F:→ AndCycle: 我的意思是你去google, stackoverflow 早就有人回答 08/06 18:18
65F:→ alan23273850: 喔喔,可是他那篇還是沒寫出怎麼用自己的實作取代掉 08/06 18:30
66F:→ alan23273850: 內建的__import__,我說finder的部分,loader我不管 08/06 18:31
67F:→ AndCycle: 扒 importlib 的 source code 看啊 ... 08/06 18:45
68F:→ uranusjr: 你都看得懂網路文章了, 直接寫英文去 discc.python.org 08/07 11:26
69F:→ uranusjr: 問會比較容易得到答案, 這邊問就算放酬勞也沒什麼用 08/07 11:26
70F:→ s860134: 其實我比較好奇你想做什麼修改 08/07 21:34
71F:→ alan23273850: 送!我找到答案ㄌ,大家不用再為我操心了唷 08/08 10:41
72F:→ alan23273850: https://github.com/abarnert/floatliteralhack 08/08 10:42
73F:→ alan23273850: 答案就在樓上這一篇跟它readme裡面所提到的文章囉! 08/08 10:43
74F:推 Yshuan: https://docs.python.org/2/library/imp.html 這個嗎? 08/11 15:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP