V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JCZ2MkKb5S8ZX9pq
V2EX  ›  问与答

本地启动多个 http-server 能在一个窗口里嘛?

  •  
  •   JCZ2MkKb5S8ZX9pq · 2020-04-12 18:43:19 +08:00 · 2026 次点击
    这是一个创建于 1690 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

    • 先是本地有一个静态站,平时 docsify 啥的也在一起,所以需要对这个目录启动一个 server 。

      python -m http.server 80 --directory D:\OneDrive\mysite\ --bind 10.0.0.13
      
    • 然后还写了一些 rest 接口,好用手机控制 PC 的快进 /播放暂停 /音量 /切换窗口 /等动作,这也需要启动一个 server 。用的是一个 python 。

      from wsgiref.simple_server import make_server
      
    • 另外还有几个类似计划任务的小工具,比如定期清理目录,备份各个软件的配置文件,更新 PAC 等等。

    • 系统是 Win10

    提问

    • 能否把以上几个功能整合到一个窗口里,开机自动启动?
    • 在 Mac 上的话我是用 tmux,Windows 现在用的 cmder,但没实现过类似功能。
    • 请大家给点建议。
    第 1 条附言  ·  2020-04-13 21:39:21 +08:00

    最终解决方案如下,写个主python文件,然后开机自动运行就好了。 为了看得清晰点,可以在子进程的logging里都打一下各自的pid。

    from multiprocessing import Pool
    import os
    
    cmd_list = [
        r'python -m http.server 80 --directory D:\OneDrive\erimus-koo.github.io\ --bind 10.0.0.13',
        r'python D:\1.py',
        r'python D:\2.py'
    ]
    
    
    def run_cmd(cmd):
        os.system(cmd)
    
    
    def main():
        p = Pool(len(cmd_list))
        for cmd in cmd_list:
            p.apply_async(run_cmd, (cmd,))
        p.close()
        p.join()
    
    favourstreet
        1
    favourstreet  
       2020-04-12 19:25:59 +08:00 via Android
    多个 httpserver 怎么启动得起来,80 端口只有一个
    whywhywhy
        2
    whywhywhy  
       2020-04-12 19:26:23 +08:00
    为啥不用隐藏窗口或者服务的方式运行呢
    just1
        3
    just1  
       2020-04-12 19:27:03 +08:00
    任务计划程序,创建计划任务
    raymanr
        4
    raymanr  
       2020-04-12 19:32:12 +08:00   ❤️ 1
    windows terminal 可以放在一个窗口,自动启动你可以看看有没有办法研究一下
    也可以用 pythonw 运行就不显示窗口
    JCZ2MkKb5S8ZX9pq
        5
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 19:32:59 +08:00
    @favourstreet
    port 可以改的呀
    make_server('', port, dispatcher)
    JCZ2MkKb5S8ZX9pq
        6
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 19:33:49 +08:00
    @whywhywhy 不太懂怎么搞,能稍微具体点提点一下吗?
    niubee1
        7
    niubee1  
       2020-04-12 19:34:59 +08:00
    mac 下有 nginx,为毛不用?
    niubee1
        8
    niubee1  
       2020-04-12 19:36:17 +08:00   ❤️ 1
    win10 有 wsl,为啥不用
    JCZ2MkKb5S8ZX9pq
        9
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 19:39:10 +08:00
    @niubee1
    首先感谢你的回复。个人愚见,如果直接回复:
    '''
    mac 下有 nginx,win10 有 wsl,可以尝试一下。
    '''
    也许会让您的工作生活更加顺利。
    JCZ2MkKb5S8ZX9pq
        10
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 19:40:55 +08:00
    @raymanr 其实我还是希望看到窗口,因为有些 log 信息之类的没有单独写,万一有问题稍微瞥一眼还比较方便。
    JCZ2MkKb5S8ZX9pq
        11
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 19:50:39 +08:00
    @raymanr
    请教一下,如果用 pythonw 运行的话,我怎么分辨各个 pid 在跑的是什么内容呢?
    JCZ2MkKb5S8ZX9pq
        12
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 19:57:43 +08:00
    看了下计划任务,感觉设定起来还是有点麻烦。
    还是希望写一个 py,来运行定时任务。目前的定时任务都耗时很短,所以也不涉及时间的冲突和多程的需求。

    现在的需求等于是两个 http-server 加一个定时任务控制 py,三个任务能不能合到一起,并且随 windows 启动自动运行。
    ipwx
        13
    ipwx  
       2020-04-12 20:05:52 +08:00
    相同地址同一端口只能运行一个 HTTP server 。要么你自己写 dispatcher,要么用现有的比如 nginx 。
    JCZ2MkKb5S8ZX9pq
        14
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 20:10:28 +08:00
    @ipwx
    #5 rest api 的部分是自己写了,端口也另外指定了。
    我现在的问题是能否把这两部分合起来,包括 log 都放到一个窗口里。
    Trim21
        15
    Trim21  
       2020-04-12 20:19:27 +08:00 via Android
    之前用 golang 写过一个类似的程序自己用…
    ipwx
        16
    ipwx  
       2020-04-12 21:02:28 +08:00
    @JCZ2MkKb5S8ZX9pq To tell the truth, 写个界面程序属于太麻烦了我不想做的事情之一。虽然很多时候我也会像你一样想要个托盘程序,但是十分钟之内我就会放弃。
    Trim21
        17
    Trim21  
       2020-04-12 21:11:54 +08:00
    https://github.com/Trim21/commandTray 用 go 写的

    本来折腾过托盘,但是 golang 的各种托盘库不是打开有明显的延迟就是编译很麻烦,所以后来就改成了 cli 程序

    自动启动全靠计划任务
    Trim21
        18
    Trim21  
       2020-04-12 21:13:37 +08:00
    @Trim21 #17 log 我是在各个程序里面分别打的,所以也没有 log 重定向的功能...
    cmdOptionKana
        19
    cmdOptionKana  
       2020-04-12 21:14:49 +08:00
    @JCZ2MkKb5S8ZX9pq 我也有一个类似的需求,这是我的解决方案:

    截图 https://i.loli.net/2020/04/12/qYcUzSpfi3I9Bvb.jpg

    代码 https://github.com/ahui2016/mima-go/blob/master/mima-gui.ahk

    一共才 74 行代码。autohotkey 可以把这一系列操作自动化:打开 console, 输入命令,隐藏 console 。

    然后我做了一个按钮用来把隐藏的 console 重新显示,这样就能查看 log 了。

    当然,我这个只是单个程序,你修改一下让它自动操作多个程序应该不难。
    JCZ2MkKb5S8ZX9pq
        20
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 21:29:25 +08:00
    @cmdOptionKana
    请问你的 PID 是怎么对应上的呢?查看进程管理器然后手敲吗?

    我看楼上说的 pythonw 的确是个清净的办法,但是在需要查看的时候怎么调起对应的 PID 窗口我还没有好的方法。

    其实类似 tmux 的方案我是觉得还不错,如果能直接跨平台就好了,毕竟 mac 上已经配置了一堆。
    cmdOptionKana
        21
    cmdOptionKana  
       2020-04-12 21:32:32 +08:00
    @JCZ2MkKb5S8ZX9pq autohotkey 会帮你对应 pid 。

    用 autohotkey 的代码来打开窗口,这个窗口就受你控制了。
    JCZ2MkKb5S8ZX9pq
        22
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-12 21:34:37 +08:00
    @cmdOptionKana
    那我再看看你的代码,刚才没看明白。
    cmdOptionKana
        23
    cmdOptionKana  
       2020-04-12 21:34:41 +08:00
    @JCZ2MkKb5S8ZX9pq 我用 autohotkey 打开控制台,于是这个控制台就受我控制,我可以用让它隐藏、显示、输入命令、输入回车或任何按键。
    dicc
        24
    dicc  
       2020-04-13 10:29:46 +08:00   ❤️ 1
    import os
    import threading


    def start(cmd):
    while 1:
    os.system('"%s"' % cmd)
    print('>>>', cmd)


    def run(cmd):
    threading._start_new_thread(start, (cmd, ))


    run(r'D:\app\bill.bat - 快捷方式.lnk')
    run(r'D:\app\frps_run.bat - tmp.lnk')
    run(r'D:\app\frps_run.bat - 快捷方式.lnk')
    run(r'D:\app\serv.bat - 快捷方式.lnk')
    start(r"D:\app\webd.bat - 快捷方式.lnk")
    dicc
        25
    dicc  
       2020-04-13 10:30:21 +08:00
    改下缩进, 我就是这样勉强用着的
    JCZ2MkKb5S8ZX9pq
        26
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-13 14:19:06 +08:00
    @dicc
    嗯,你这个倒提醒我了。
    以前用过 multiprocessing,记得是可以打印子进程的内容的。
    threading 倒是没怎么用过,我感觉可以尝试一下。
    JCZ2MkKb5S8ZX9pq
        27
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-13 21:20:19 +08:00
    @dicc 试了一下多进程
    def main():
    p = Pool(len(cmd_list)) # 设置进程数
    for cmd in cmd_list:
    p.apply_async(os.system(cmd))
    p.close()
    p.join()
    JCZ2MkKb5S8ZX9pq
        28
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-13 21:21:24 +08:00
    @dicc 不过这样写的话,只能打印到 cmd_list 里的第一个 cmd 的信息,后面两个在后台,但打印信息回不到主窗口。不知道怎么改进比较好。
    JCZ2MkKb5S8ZX9pq
        29
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-13 21:35:00 +08:00
    @dicc 发现还是不能偷懒,拆成 function 顺利解决。
    详见 append 。
    dicc
        30
    dicc  
       2020-04-13 21:39:13 +08:00
    @JCZ2MkKb5S8ZX9pq http://chat.bpbpbp.xyz:8000/download/tt.7z/static/upload/faffc1f15ef0ed31.7z

    我用的多线程,不是多进程,不信你试试我这个,执行 tt-main.py 就行了
    JCZ2MkKb5S8ZX9pq
        31
    JCZ2MkKb5S8ZX9pq  
    OP
       2020-04-13 21:40:32 +08:00
    @dicc 我知道你是多线,我个人偏好多进程一点,能用就行哈。刚补齐 append 的部分了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5156 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:55 · PVG 11:55 · LAX 19:55 · JFK 22:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.