V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chenqh
V2EX  ›  Python

关于 windows 下直接调用 Python 脚本的问题

  •  
  •   chenqh · 57 天前 · 1736 次点击
    这是一个创建于 57 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我记得 linux 下面只要把 python 脚本的目录路径加到 path 里面,然后 xx.py 就可以调用了.

    但是在 windows 下面,要绑架 py 的处理器,也就是 python,然后直接 xx.py 会直接弹出一个黑框,估计是在黑框里 调用了命令行了,这个肯定是不符预期的,毕竟如果出错了,什么也不知道.

    现在我是通过把目录路径添加 PYTHONPATH 里面,然后 python -m xx 来调用的.这效果是最接近的,就是前面多少一个 python -m

    windows 下面有什么方法也像 linux 一样.直接 xx.py,不需要全路径,不会弹黑框

    13 条回复    2024-07-14 21:48:07 +08:00
    bronyakaka
        1
    bronyakaka  
       57 天前   ❤️ 1
    我知道的 pyinstaller 打包
    qilme
        2
    qilme  
       57 天前 via Android   ❤️ 1
    绑定 pyw 就行
    ModiKa2022
        3
    ModiKa2022  
       56 天前
    安装一个 pyenv, 直接使用 pyenv use {对应的 python 版本} 使用 python xx.py 运行
    UncleCAT4
        4
    UncleCAT4  
       56 天前 via Android
    黑框是 cmd 吧我记得,可以用 pyinstaller 打包
    pursuer
        5
    pursuer  
       56 天前
    调用命令行是符合预期的行为,你说的黑框只是会 AllocConsole. 绑定 pythonw 就会隐藏 Console 了。
    barkure
        6
    barkure  
       56 天前 via Android
    pythonw
    fbichijing
        7
    fbichijing  
       56 天前
    你的描述好奇怪啊。我觉得 Linux 系统和 Windows 系统调用 .py 的方式本质上一样的啊。

    运行 .py 文件:
    1. 通过该该文件的绝对路径;
    2. 如果该文件所在的路径在 path 里面,则可以直接使用文件名;

    所以两者没区别吧。

    你在 linux 调用没有黑框,那是因为是在 console 里面调用运行的。Windows 如果在 console 里面运行也没有黑框啊(本身 console 就是)。
    而至于在 Windows 下双击运行没黑框,将文件后缀改一下就好了。.py > .pyw 。一直都是这么做的吧。自己写的 .pyw 的 gui 如果本地跑而不想打包的话。

    ---------
    "但是在 windows 下面,要绑架 py 的处理器,也就是 python,然后直接 xx.py 会直接弹出一个黑框,估计是在黑框里 调用了命令行了,这个肯定是不符预期的,毕竟如果出错了,什么也不知道."

    这个部分是想表达:linux 下运行 .py 脚本有错误的时候,黑框存在,而 windows 下会一闪而过?
    如果是这样的话,不是必然的吗?在 Windows 里面先打开 console 再运行 .py 文件,异常的话也能被 catch 到。
    ------
    出于我自己对你表述的部分产生的某种思考的延伸,可能你是想表达:在 Windows 下,双击 .py 文件运行了某个脚本,但是异常就直接一闪而过,无法获得异常原因。不知道这是不是你想表达的问题?

    如果这是你想表达的问题之一的话:
    一般都是类似与这种形式(脚本类而不是 gui):
    ```python
    def main():
    pass

    if __name__ == '__main__':
    try:
    main()
    except:
    # 异常代码自己写,或可以通过 traceprint 输出详细信息
    pass
    finally:
    # 最后,将黑窗口停住就行了。好像 C 语言也是这么玩的吧。
    os.system('pause')
    ```

    全局运行的常用的逻辑如果写成脚本的话,还是通过 setup.py 打包成全局命令。可以获得很大的灵活性,同时也直接适配多个系统。我觉得这样做比较有趣。
    chenqh
        8
    chenqh  
    OP
       56 天前
    @fbichijing 不是啊. linux 下面你在终端输入 xx.py 实际上是在当前终端下运行的啊. 但是 windows 下面你终端 输入 xx.py 他会弹个黑框,然后就消失啊
    julyclyde
        9
    julyclyde  
       55 天前
    @chenqh 运行完了可不就消失么?你还想怎么样?
    volvo007
        10
    volvo007  
       55 天前
    如果需要黑框,而且也不介意以 python xx.py 的方式运行的话,可以写一个 .bat 文件,把需要的内容包在里面。

    @echo off
    call c:\xxx\miniconda3\Scripts\activate.bat c:\xxx\miniconda3\your_env
    call conda activate your_env
    call python path\xxx.py
    pause

    这样应该可以,具体细节可以再搜一下,但是应该是可以跑起来并且 cmd 框不会消失的。这两天我刚这么写过一个

    这里的关键一个是如何调用需要的 py 环境(通过 call 一个 conda 的 script ),另一个就是黑框不消失(通过 pause ),这样运行需要你手动 ctrl+c 才会提示退出
    PixelWanderer
        11
    PixelWanderer  
       55 天前
    linux 是因为前面有#!/usr/bin/python 吧
    chenqh
        12
    chenqh  
    OP
       55 天前
    @PixelWanderer 是的..
    yinmin
        13
    yinmin  
       55 天前
    @chenqh 这道题我会解:

    资源管理器右键点 py 文件 -> 打开方式 -> 选择其他应用 -> 选中”始终使用此应用打开.py 文件” -> 选择 pythonw.exe
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:43 · PVG 07:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.