如何代理嵌套模块?
How to proxify a nested module?
假设我使用请求库导入了一个模块,但想对其使用代理。我在这里有两个选择:为这个库制作一个自定义补丁,这样我就可以使用代理或使用类似于 torify 的包装脚本来实现我想要的。
这些选项都不适合我,所以我想知道是否有办法使用 monkey-patching 或类似的样式来修改模块内的请求库(在 class 内)我没有。
编辑:
@zedfoxus 我正在使用位于 Mega.py 的库:richard.../mega.py
这是我迄今为止尝试过的猴子修补技术:
import inspect
from mega import mega
pr = 'https://103.9.124.210:8080'
p = {'https': pr, 'http': pr}
string = (
inspect.getsource(mega).replace(
'from .', 'from mega.' # fix relative imports
).replace(
'requests', '_req'
).replace(
'import _req', f'import requests\n_req = requests.Session\n_req.proxies = {p}'
).replace(
'def login(self, email=None, password=None):', 'def login(self, email=None, password=None):\n print("milkGang")'
).replace(' ', '\t') # follow my indentation style (tabs)
)
# milkgang shows up when I run the call, but the request proxy is not set :(
del mega
exec(string)
m = Mega()
...
我也试过:
import requests
requests = requests.Session() # yes I know this is dangerous
### paste proxy code from earlier here ###
requests.proxies = p
import mega
和
import mega
import requests
requests = requests.Session() # yes I know this is dangerous
### paste proxy code from earlier here ###
requests.proxies = p
以及重新定义 mega.Mega
class
编辑 2:
修改我第一次尝试说 Session()
而不是 Session
似乎可行,但是,有没有更简洁的方法?
重新访问后,mega
模块似乎有一个名为 mega
(mega.mega
) 的自属性,我可以在其中看到导入的模块(并且由于 python 的性质, 也可以轻松更改它们)
import mega
from requests import Session
mega.mega.requests = Session()
# :)
假设我使用请求库导入了一个模块,但想对其使用代理。我在这里有两个选择:为这个库制作一个自定义补丁,这样我就可以使用代理或使用类似于 torify 的包装脚本来实现我想要的。
这些选项都不适合我,所以我想知道是否有办法使用 monkey-patching 或类似的样式来修改模块内的请求库(在 class 内)我没有。
编辑:
@zedfoxus 我正在使用位于 Mega.py 的库:richard.../mega.py
这是我迄今为止尝试过的猴子修补技术:
import inspect
from mega import mega
pr = 'https://103.9.124.210:8080'
p = {'https': pr, 'http': pr}
string = (
inspect.getsource(mega).replace(
'from .', 'from mega.' # fix relative imports
).replace(
'requests', '_req'
).replace(
'import _req', f'import requests\n_req = requests.Session\n_req.proxies = {p}'
).replace(
'def login(self, email=None, password=None):', 'def login(self, email=None, password=None):\n print("milkGang")'
).replace(' ', '\t') # follow my indentation style (tabs)
)
# milkgang shows up when I run the call, but the request proxy is not set :(
del mega
exec(string)
m = Mega()
...
我也试过:
import requests
requests = requests.Session() # yes I know this is dangerous
### paste proxy code from earlier here ###
requests.proxies = p
import mega
和
import mega
import requests
requests = requests.Session() # yes I know this is dangerous
### paste proxy code from earlier here ###
requests.proxies = p
以及重新定义 mega.Mega
class
编辑 2:
修改我第一次尝试说 Session()
而不是 Session
似乎可行,但是,有没有更简洁的方法?
重新访问后,mega
模块似乎有一个名为 mega
(mega.mega
) 的自属性,我可以在其中看到导入的模块(并且由于 python 的性质, 也可以轻松更改它们)
import mega
from requests import Session
mega.mega.requests = Session()
# :)