首页 > 解决方案 > 处理在python中覆盖导入库的正确方法是什么?

问题描述

我正在开发一个烧瓶项目,并在这样做时使用了 shareplum 库。我意识到我需要的一些方法只是对该库中一些现有方法的轻微更改。我将我的方法添加到该库中的一个文件中。

我在 venv 工作,所以这只影响这个项目,但我很确定这不是正确的方法。

我的结构是基本的烧瓶结构。

integrator.xxx.int/
├── app
│   ├── __pycache__
│   ├── static
│   └── templates
├── __pycache__
├── test_scripts
└── venv
    ├── bin
    ├── include
    ├── lib
    ├── lib64 -> lib
    └── share

文件位于 venv/lib/python3.x/site-packages/shareplum/folder.py 中。在该文件中有一个 get_image、get_file 和 get_folder。我添加了 get_images、get_files 和 get_folders。

正确的方法是什么,正确的地方是什么?

我已将该文件添加到 git 以便对其进行跟踪。这似乎可行,但我遇到了不在完全相同版本的 python 上的问题。这是我没有正确设置我的 venv 的问题,也许如果它将该文件添加到 vcs 是正确的答案。

谢谢

更多信息。我很困惑到底要在这里覆盖什么。

来自Shareplum docs的文档:

folder = site.Folder('Shared Documents/This Folder')

我创建了一个访问类来访问 shareplum。

app/sharepointacces.py 的相关部分

from shareplum import Site
from shareplum import Office365
from shareplum.site import Version
import os.path
from os import path

class SPAccess:

    def __init__(self):
        server_url = "https://x.sharepoint.com/"
        site_url = "sites/x/"

        un = "x"
        pw = "x"
        authcookie = Office365(server_url, username=un, password=pw).GetCookies()
        self.site = Site(server_url + site_url, version=Version.v2016, authcookie=authcookie)


    def getFolderList(self, folderURL):
        folder = site.Folder(folderURL)
        return(folder.get_folders())

    def getFileList(self, folderURL):
        folderURL = folderURL.replace(".", "")
        folder = self.site.Folder(folderURL)
        return(folder.get_files())

folder.get_folders() 是我添加的方法之一。

这是从 routes.py 实例化的:

   spa = SPAccess()
fileInfo = spa.getFileList(docURL)

所以通过这个先前的答案我可以正确扩展文件夹吗?

我创建了一个 app/sptools.py 并按照它所说的那样做,那就是拥有原始的所有方法。

from shareplum import folder

class SPTools(folder.SPTools):
    def __init__(self, session, folder_name, url):
        self._session = session
        self.folder_name = folder_name
        self.site_url = url
        self.timeout = 3

        self.info = self._create_folder()

    @property
    def contextinfo(self):
        pass

    def _create_folder(self):
        pass

    def delete_folder(self, relative_url):
        pass

    def delete_file(self, file_name):
        pass

    @property
    def items(self):
        pass

    @property
    def files(self):
        pass

    def upload_file(self, content, file_name):
        pass

    def check_out(self, file_name):
        pass

    def check_in(self, file_name, comment):
        pass

    def get_file(self, file_name):
        pass

# custom methods below.

    def get_files(self):
        response = self._session.get(self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')/files")
        data = json.loads(response.text)
        return data['value']


    def get_folders(self):
        response = self._session.get(self.site_url + f"/_api/web/GetFolderByServerRelativeUrl('{self.folder_name}')/folders")
        data = json.loads(response.text)
        return data['value']

    def get_image(self, file_name):
        response = self._session.get(self.site_url + f"/_api/web/GetFileByServerRelativeUrl('{self.info['d']['ServerRelativeUrl']}/{file_name}')/$value")
        if response.status_code== 200:
            with open('/sites/integrator.cng.int/app/static/images/' +
                      file_name + '.jpg', 'wb') as f:
                f.write(response.content)
        return "ok"

#this pulls the images down and saves them locally if they're not there already. 
    def get_images(self, fileName):
            response = self._session.get(self.site_url + f"/_api/web/GetFileByServerRelativeUrl('{self.info['d']['ServerRelativeUrl']}/{fileName}')/$value")
            if response.status_code== 200:
                fileName = fileName[-22:]
                with open('/sites/integrator.cng.int/app/static/images/' +
                          fileName, 'wb') as f:
                    f.write(response.content)
            return

但现在我很困惑。由于文件夹从 sharepointaccess.py 被称为 site.Folder 我只需将我的新类导入 sharepointaccess.py 而不是

site.Folder 

我愿意

site.SPTools

我不这么认为,因为文件夹是从站点导入的。

那是对的吗?我对如何导入我的感到困惑。由于文件夹永远不会在共享点访问中隐式导入,我认为依赖于 venv/lib/python3.8/site-packates/shareplum/site.py 内部

from .folder import _Folder

标签: pythonpython-3.xoop

解决方案


推荐阅读