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

128 天前
 chenqh

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

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

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

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

1853 次点击
所在节点    Python
13 条回复
bronyakaka
128 天前
我知道的 pyinstaller 打包
qilme
128 天前
绑定 pyw 就行
ModiKa2022
127 天前
安装一个 pyenv, 直接使用 pyenv use {对应的 python 版本} 使用 python xx.py 运行
1rv013c6aiWPGt24
127 天前
黑框是 cmd 吧我记得,可以用 pyinstaller 打包
pursuer
127 天前
调用命令行是符合预期的行为,你说的黑框只是会 AllocConsole. 绑定 pythonw 就会隐藏 Console 了。
barkure
127 天前
pythonw
fbichijing
127 天前
你的描述好奇怪啊。我觉得 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
127 天前
@fbichijing 不是啊. linux 下面你在终端输入 xx.py 实际上是在当前终端下运行的啊. 但是 windows 下面你终端 输入 xx.py 他会弹个黑框,然后就消失啊
julyclyde
126 天前
@chenqh 运行完了可不就消失么?你还想怎么样?
volvo007
126 天前
如果需要黑框,而且也不介意以 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
126 天前
linux 是因为前面有#!/usr/bin/python 吧
chenqh
126 天前
@PixelWanderer 是的..
yinmin
126 天前
@chenqh 这道题我会解:

资源管理器右键点 py 文件 -> 打开方式 -> 选择其他应用 -> 选中”始终使用此应用打开.py 文件” -> 选择 pythonw.exe

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1056932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX