覆盖所有依赖项中的Python操作系统库



我使用的是pypi的官方库,这些库严重依赖于os库的open、isfile、makedirs等,如果你想使用GCS、S3或其他基于云的存储,这些库是非常有限的。我不想破坏官方库的内部,但有一个快速补丁,可以让所有导入的库都回到我的实现中。比方说os.path.isfile = my_isfile_fun,但仅当pathgs://s3://开头时,否则它使用标准库(我不想完全破坏它(。有办法做到这一点吗?另外,我不想修改整个库,只想修改一些函数。

以下是的场景

import some_pypi_module # <--- it uses os library
some_pypi_module.save(path) # <--- is saves to the path on disk using os library

我想要的场景

# do something to patch os
#
import some_pypi_module # <--- it uses modified os library
some_pypi_module.save(path) # <--- is saves to the path on disk using modified os library and now can understand gs://

我不确定这是个好主意,但在导入后可以从导入的模块中重新定义函数和变量。Hree是使用numpy:的一个例子

>>> import numpy as np
>>> np.pi
3.141592653589793
>>> np.pi = 4
>>> np.pi
4
>>> np.sin(0)
0.0
>>> np.sin = lambda x : x+1
>>> np.sin(0)
1

因此,一种可能的解决方案是在您需要的文件中使用if语句进行检查,然后进行必要的调整。

然而,我再次不确定这个想法到底有多好,因为它可能会导致一些非常令人困惑的错误。

您可以通过以下方式进行修补:

import os
os.path.isfile_old = os.path.isfile
def my_isfile_fun(path):
if(path.startswith(('s3://', 'gs://')):
#use boto3 head object or your logic that you wish to implement
else:
return os.path.isfile_old(path)
os.path.isfile = my_isfile_fun

现在当你触发

os.path.isfile(path)

它将相应地返回值

希望它能帮助

最新更新