V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
huangzhiyia
V2EX  ›  分享创造

发布人生第一个 Python 包

  •  
  •   huangzhiyia · 2022-01-17 18:34:52 +08:00 · 3018 次点击
    这是一个创建于 1070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目

    https://github.com/zmaplex/fetch_import

    为什么造轮子

    因为自己最近要编写插件系统,如果写死在项目中,每次都要随着项目更新才能更新插件。然后自己想把插件放在一个可访问的 URL 中,每次都要重新写一遍动态加载的代码,感觉很烦所以有了这个简陋的项目。

    兼容性啥的都没有,建议 Python 版本 >= 3.6 。

    示例

    from fetch_import import import_attr
    
    
    # equivalent "from youtube_downloader import YoutubeDownloader"
    @import_attr(
        "https://raw.githubusercontent.com/zmaplex/fetch_import/main/example/youtube_downloader.py",
        "YoutubeDownloader")
    def main():
        ydl_opts = {
            'f': 'bestvideo+bestaudio[ext=m4a]',
            'ratelimit': 1024 * 1024 * 1024,
            'merge-output-format': 'mp4'}
    
        job_args = {
            "job_id": "63ba4e4e67cf417ab6a27365cecabec5",
            "plugin_args": {
                "url": "https://www.youtube.com/watch?v=UvuJx7rVUxg",
                "ydl_opts": ydl_opts
            }
        }
        yd = YoutubeDownloader()
        yd.run(**job_args)
    

    想要改进的

    这是今天匆忙赶出来的第一个版本,有很多想法没实现,也有很多问题,包括使用文档还没有写。

    未来几周会抽出时间逐渐完善的,初步想要实现的是暴露两个方法去远程加载包。

    比如实现远程加载以下的对象

    # 这个可以用 import_attr 来实现
    from typing import List, Dict, Tuple, Any
    
    # 待实现
    import typing
    from typing import *
    

    我希望只要暴露两个装饰器以及函数能实现以上的功能就可以了。

    # 目前只暴露了一个装饰器只能这样实现
    
    @import_attr("https://example.com/typing.py","List")
    @import_attr("https://example.com/typing.py","Dict")
    @import_attr("https://example.com/typing.py","Tuple")
    @import_attr("https://example.com/typing.py","Any")
    def main():
    	pass
        
    # 后续会增加 一个装饰器以及函数来实现更简短的代码
    # @import_attrs("https://example.com/typing.py",["List","Dict","Tuple","Any"])
    
    8 条回复    2022-01-18 18:59:30 +08:00
    zhangjinghua
        1
    zhangjinghua  
       2022-01-17 18:45:08 +08:00
    虽然不知道是做什么用的(目前看来好像就是下视频的),但是我还是给了个星星
    lc1450
        2
    lc1450  
       2022-01-17 18:51:46 +08:00
    log4j 警告 🐶
    huangzhiyia
        3
    huangzhiyia  
    OP
       2022-01-17 18:54:55 +08:00
    @lc1450 哈哈哈,( •̀ ω •́ )y 如果以后影响力有那么广就好了,到时候破产可能也要删库跑路🤣🤣
    anc95
        4
    anc95  
       2022-01-17 21:47:44 +08:00
    不错的开始
    yyingx
        5
    yyingx  
       2022-01-18 00:12:06 +08:00
    目前有比较成熟的 yt_dlp,还是顶楼主
    minmini
        6
    minmini  
       2022-01-18 08:52:06 +08:00
    几年前做过一个类似的东西。用 flask 监听一个接口,然后 POST 请求传入模块名字和执行参数,就去执行项目文件夹里面的 python 文件。就是为了大家可以吧自己的脚本丢到服务器里面去执行
    后来发现有的可以动态加载,有的不行,还是要重启,但是我懒……就没去优化过了
    感觉 OP 的这个方案更优雅,准备有空把那个老项目改改了😝
    2i2Re2PLMaDnghL
        7
    2i2Re2PLMaDnghL  
       2022-01-18 12:53:02 +08:00
    没有 License ,应被视为专有代码。
    huangzhiyia
        8
    huangzhiyia  
    OP
       2022-01-18 18:59:30 +08:00
    @2i2Re2PLMaDnghL 这个先开发再考虑使用哪个 License
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   905 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.