V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luxinfl
V2EX  ›  程序员

Python 新手,有个关闭终端的问题

  •  
  •   luxinfl · 2020-07-14 10:17:08 +08:00 · 4131 次点击
    这是一个创建于 1375 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我搞了个一键打卡的脚本,双击后会弹出一个窗口显示运行消息。我想程序执行完自动关闭这个窗口。结果搜遍了百度,就找了这俩命令,结果鸟用没有。

    • os._exit(0)
    • sys.exit(0)

    有什么办法可以解决么

    第 1 条附言  ·  2020-07-14 11:10:48 +08:00

    if name == "main":

    chrome_options = Options()
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.set_window_size(1000,800)
    # driver = webdriver.Chrome()
    try:
        driver.get("url")
    
    ## 省略打卡内容
    
    finally:
        print('------------------')
        print('------打卡成功--------')
        print('------------------')
    
        os._exit(0) 
        sys.exit(0)
    
    第 2 条附言  ·  2020-07-14 11:16:35 +08:00
    改成.pyw 之后,还是会有窗口,但是窗口的 title 变了,变成了 E:\Python\chromedirver.exe ,这个是驱动所在的路径。而且[15972:8840:0714/111511.285:ERROR:ssl_client_socket_impl.cc(959)] handshake failed; returned -1, SSL error code 1, net_error -202 一直会有这个报错的。
    第 3 条附言  ·  2020-07-14 12:14:36 +08:00
    找到方法了

    driver.quit()就行了

    猜测是这个组件的问题
    25 条回复    2020-07-15 16:30:25 +08:00
    ruanimal
        1
    ruanimal  
       2020-07-14 10:23:44 +08:00
    是 windows 吧,那个是系统控制台的窗口,在脚本里是关闭不了的。

    可以把脚本的扩展名改成 pyw, 可以避免这个窗口
    css3
        2
    css3  
       2020-07-14 10:31:00 +08:00
    @luxinfl 你是不是嫌黑框闪的太快了?
    time.sleep(10)
    sys.exit(0)
    或者搞个按键监听,按下 C 键再退出,否则停留在黑框
    css3
        3
    css3  
       2020-07-14 10:33:54 +08:00
    @css3 好像看错楼主问题了😂
    emm, 我了解的是,正常情况下,执行完就就是闪退出去了啊
    dingwen07
        4
    dingwen07  
       2020-07-14 10:35:47 +08:00
    黑框在执行完肯定会关掉的 除非启动方式不是给 python 传值
    如果用了 gui 那就用 destroy 关掉窗体
    princelai
        5
    princelai  
       2020-07-14 10:36:45 +08:00
    再写个.bat ,调用你的脚本
    Vhc
        6
    Vhc  
       2020-07-14 10:37:24 +08:00
    Python 脚本运行结束会自动关闭窗口的。你确定自己不是写了死循环?
    shuax
        7
    shuax  
       2020-07-14 10:55:27 +08:00
    改成 pyw
    luxinfl
        8
    luxinfl  
    OP
       2020-07-14 11:05:33 +08:00
    @ruanimal 我试了 pyw,也没什么用啊。python 的窗口还是会出来的
    luxinfl
        9
    luxinfl  
    OP
       2020-07-14 11:06:16 +08:00
    @css3 没有关闭啊,我卡打完了,窗口还是会一直在那里
    misaka19000
        10
    misaka19000  
       2020-07-14 11:11:09 +08:00
    Windows 执行完毕 cmd 会自动关闭了
    luxinfl
        11
    luxinfl  
    OP
       2020-07-14 11:11:28 +08:00
    @Vhc 我把代码贴出来了,就简单的一步步往下写的啊
    luxinfl
        12
    luxinfl  
    OP
       2020-07-14 11:11:47 +08:00
    @misaka19000 就是没关闭,所以才想问问咋回事
    nonduality
        13
    nonduality  
       2020-07-14 11:25:06 +08:00
    你可以尝试获取窗口进程的 pid 号,在退出前 kill 之。
    MerlinShieh
        14
    MerlinShieh  
       2020-07-14 11:35:57 +08:00
    一般执行完就会关闭掉的,如果不行的话可以写个 bat 去执行脚本,再不行就获取 pid 然后 kill
    luxinfl
        15
    luxinfl  
    OP
       2020-07-14 11:36:39 +08:00
    @MerlinShieh bat 试过了,打包成 exe 也试了,都不行。。感觉只能 kill 了。。
    oahebky
        16
    oahebky  
       2020-07-14 12:23:07 +08:00 via Android   ❤️ 6
    无语,我就说早上第一次点卡这个帖子看着奇怪。理论上不可能发生的事情没法回答。

    原来说的是调用 selenium 后「浏览器」窗口没有关闭的问题。

    搞得神神秘秘的,selenium 不说,「浏览器」也不说;提问题,问题都描述不清楚。
    bonfy
        17
    bonfy  
       2020-07-14 13:14:52 +08:00
    ```python
    options = webdriver.ChromeOptions()
    options.add_argument('headless')
    options.add_argument('--disable-gpu')
    executable_path = CONFIG.get('driverpath')
    driver = webdriver.Chrome(
    chrome_options=options, executable_path=executable_path
    )

    ...
    driver.close()
    ```

    最好还是用 api 之类的吧
    css3
        18
    css3  
       2020-07-14 13:47:35 +08:00
    @oahebky 😂😂😂😂,对头
    ruanimal
        19
    ruanimal  
       2020-07-14 14:19:07 +08:00
    @oahebky 看来提问的基本修养很重要啊。。。
    luxinfl
        20
    luxinfl  
    OP
       2020-07-14 15:41:23 +08:00
    @oahebky nono 不是浏览器窗口没关闭的问题。不过你硬要这么说也没啥问题,程序还没跑完,python 的命令行窗口还是一直在显示。现在在代码后面调用了 driver 的 quit 方法,程序就结束了,命令行窗口和浏览器就都关闭了
    luxinfl
        21
    luxinfl  
    OP
       2020-07-14 15:42:36 +08:00
    @bonfy 我最后调用了 driver.quit()方法。网上呢,一直在说什么 os.exit(),system.exit(),根本就没啥用。
    ungrown
        22
    ungrown  
       2020-07-14 16:54:02 +08:00
    @luxinfl #21
    这不是网上提供的信息不对,也不是你使用网上信息的方法不对,是你弄错了导致问题的原因。
    上面 @oahebky #16 提到浏览器没关闭导致流程被阻塞,不管其叙述是否覆盖了所有细节,思路没有错。
    你在 python 进程里起了一个浏览器的 driver,那么这个 driver 不关闭的话,当然是要阻塞后续代码的,那两行 exit 的代码压根没有机会被运行。
    如果你把 driver 退出的话,exit 就不需要了,实际上我们平时写的东西也很少去用 exit 的,因为代码跑完了,python 会自动退出,不需要 exit 。exit 一般用在特殊场景下,需要在程序运行过程中、尚未结束的时候退出,才会用到。
    冰箱门还没关,却一个劲在那琢磨为什么冰箱里面的灯还不灭呢?我明明已经把要拿的东西拿出来了呀……
    所以你这属于基本概念不扎实导致的,因果链没建立,所以才会既不知道怎么来的也不明白怎么没的。
    Gakho
        23
    Gakho  
       2020-07-14 17:15:59 +08:00
    @luxinfl #21 。。。怎么说呢,应该是基础导致了提问题的要点都不对了,用到了 selenium 都能只口不提
    luxinfl
        24
    luxinfl  
    OP
       2020-07-15 16:29:49 +08:00
    @ungrown 确实基本概念不太扎实。刚写一两天。而且我是看到我最后的 print ()方法是执行的了,所以我会认为代码已经跑到后面。
    luxinfl
        25
    luxinfl  
    OP
       2020-07-15 16:30:25 +08:00
    @Gakho 所以我怕我提的问题不清晰,我把代码都贴出来了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2395 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:19 · PVG 08:19 · LAX 17:19 · JFK 20:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.