Skip to content

Conversation

@myd7349
Copy link
Contributor

@myd7349 myd7349 commented Mar 5, 2022

基于如下几点原因,GUI 版本的 PyStand.exe 不太适合封装一个 Python 命令行脚本(比如:https://github.com/myd7349/Ongoing-Study/blob/master/python/extract_columns.py ):

  • 未重定向 stdin,导致无法通过 input 函数接收用户输入;
  • GUI+AttachConsole 副作用:GUI 版的 PyStand.exe 在命令行或 PowerShell 中运行后,都需要用户手动敲入 Enter 才能重新返回到命令行;

此外,命令行版本的 PyStand.exe 也更方便在 IDE 中调试的时候及时查看错误输出(比如:init_script 中的错误输出)。

本 PR 中新增一个 CMake option PYSTAND_CONSOLE_BASED,只需要:

cmake .. -A Win32 -DPYSTAND_CONSOLE_BASED=ON

即可将 PyStand.exe 编译为一个控制台应用程序。

值得讨论的一些事项:

  • 不知道大佬喜不喜欢 PYSTAND_CONSOLE_BASED 这个名字(抑或定义一个 PYSTAND_CONSOLE,或者 PYSTAND_GUI_BASED,并将 PYSTAND_GUI_BASED 默认为 ON);
  • Console 版本的 PyStand.exe 可以考虑屏蔽 os.MessageBox(本 PR 中未屏蔽);
  • Console 版本的 C++ 实现里可考虑用标准输出替换 MessageBox 来向用户呈现错误提示(本 PR 尚未这样做);
  • Console 版本的可考虑使用 _wmain(int argc, wchar_t *argv[]) 作为主函数原型,并抛弃 GetCommandLineW+CommandLineToArgvW(本 PR 尚未这样做);

参考:

myd7349 added 2 commits March 5, 2022 19:52
GUI-based PyStand is not suitable for CLI scripts:
- It doesn't redirect stdin, so user can not call `input`;
- Using AttachConsole, user must hit ENTER to exit PyStand.exe
  when it is executed from command line or PowerShell;
@skywind3000
Copy link
Owner

skywind3000 commented Mar 5, 2022

我不是特别想加这个命令行功能,因为希望强迫用户不要再 PyStand.int 里写太多东西 ,并依赖 PyStand.exe 进行调试。

更应该先完全独立的调试好你的主程序,比如 /script/main.py ,调试完了没毛病,在 PyStand.int 里:

sys.path.append(...)
import main
main.main()

就行,仅作入口用,实在有错误在 PyStand 里发生,那再看一下 console。再 AttachConsole 后有输出,并不需要
你再按一次 ENTER 才能返回命令行,你一直再命令下,随时可以输命令,只是你可以理解成有个后台任务同时
输出了新东西,把你的 prompt 给挤走了,你的当前进程并不知道该重新刷新一下 prompt 而已。

但是你还在命令行内,随时可以输入新命令。

不过要加命令行我也不反对,表达下我的倾向。

  • PYSTAND_CONSOLE 吧,简洁些。
  • 不要抛弃 GetCommandLineW ,这个独立性更强一点。
  • mingw 对 _wmain 支持不好,用 main 吧。

@myd7349
Copy link
Contributor Author

myd7349 commented Mar 6, 2022

多谢大佬的回复!

其实我是在排查 #7 的时候发现的命令行版本在某些情形下的排错优势的。
#7 是因为没能正确设置 os.environ['PYSTAND_SCRIPT'] 导致的。命令行版本的 PyStand.exe 在执行 init_script 中:

"PYSTAND_SCRIPT = os.environ['PYSTAND_SCRIPT']\n"

时会输出:

Traceback (most recent call last):
File "", line 7, in
File "os.py", line 675, in __getitem__
KeyError: 'PYSTAND_SCRIPT'

但 GUI 版本里,由于 sys.stdout、sys.stderr 的赋值是出现在这一行代码之后的,因而即使从命令行运行 PyStand.exe,也无法看到这个错误提示信息。

@skywind3000 skywind3000 merged commit 190b6d3 into skywind3000:master Mar 7, 2022
@myd7349 myd7349 deleted the console-based branch March 7, 2022 04:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants