1

source 命令也称为“点命令”,实际上就是一个点符号(.),是 Bash 的内置命令。它的功能是使 Shell 读入指定的 Shell 程序文件并依次执行文件中的所有语句。通常,source 命令用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录²。

如果你在 Windows 环境下遇到了 source 命令无法识别的问题,那是因为 Windows 的命令提示符(cmd.exe)不支持 source 命令。在 Windows 中,你可以使用 . 来替代 source 命令,例如:

. filename

这将在当前 shell 中执行 filename 中的命令,不会启动新的子 shell。请注意,filename 是你要执行的脚本文件的名称。



2

当你需要在 Windows 服务器上部署 Flask 应用时,Waitress 是一个很好的选择。它是一个纯 Python 的 WSGI 服务器,易于配置,直接支持 Windows,而且不需要额外的依赖或编译¹。

  • 使用 waitress-serve 命令来启动 Waitress 服务器。语法为 {module}:{app},其中 module 是应用模块的导入名,app 是应用程序的变量。
  • 如果你使用应用工厂模式,可以使用 --call {module}:{factory} 来代替。
  • 例如,如果你的 Flask 应用的入口是 hello.py,并且应用变量名是 app,你可以运行以下命令:


waitress-serve --host 127.0.0.1 hello:app


  • 这将在本地绑定到 127.0.0.1 的地址上运行 Waitress。
  1. 外部绑定
  • 不要以 root 身份运行 Waitress,因为这会导致应用以 root 身份运行,不安全。
  • 如果你想在非特权端口上绑定所有外部 IP,可以不使用 --host 选项。
  • 但如果你使用反向代理(如 Nginx 或 Apache httpd),请避免使用 0.0.0.0,而使用特定的 IP 地址。



3

`waitress-serve` 是一个命令行工具,用于启动 Waitress 服务器。它是 `waitress.serve` 函数的薄包装器,方便在开发和生产环境中使用。以下是关于 `waitress-serve` 的一些重要信息:


- **用法**:

 - `waitress-serve [OPTS] MODULE:OBJECT`

 - `MODULE:OBJECT` 指定应用程序,格式类似于 PasteDeploy。例如,`myapp.mymodule:wsgifunc`。

 - 对于某些应用框架,如 web.py,可以使用点号解析属性,例如 `myapp.mymodule:appobj.wsgifunc`。

 - 如果应用程序对象具有工厂方法,可以使用 `--call` 标志调用它,例如 `waitress-serve --call myapp.mymodule.app.wsgi_factory`。


- **常用选项**:

 - `--host=ADDR`:指定监听的主机名或 IP 地址,默认为 `'0.0.0.0'`,表示监听所有 IP 地址。

 - `--port=PORT`:指定监听的 TCP 端口,默认为 `'8080'`。

 - `--listen=host:port`:告知 Waitress 在指定的 IP 地址和端口上监听。例如:`--listen=127.0.0.1:8080`。

 - `--[no-]ipv4` 和 `--[no-]ipv6`:开启或关闭 IPv4 和 IPv6 支持。

 - `--unix-socket=PATH`:指定 Unix 域套接字的路径(不适用于 Windows)。

 - `--unix-socket-perms=PERMS`:设置 Unix 域套接字的权限,默认为 `'600'`。



4

waitress.serve 函数用于启动 Waitress 服务器,提供服务给传入的请求。让我为你介绍一下它的参数:

  1. app:这是你的 Flask 应用对象。将其作为参数传递给 serve 函数。
  2. host:指定监听的主机名或 IP 地址。默认为 '0.0.0.0',表示监听所有 IP 地址¹。
  3. port:指定监听的 TCP 端口,默认为 8080

例如,如果你的 Flask 应用的入口是 hello.py,并且应用变量名是 app,你可以使用以下代码启动 Waitress 服务器:


from waitress import serve if __name__ == '__main__': serve(app, host='0.0.0.0', port=5000)


这将在所有网络接口上监听端口 5000,并以非特权用户身份运行 Waitress。



5

Waitress 不应该以超级用户身份运行,因为这会导致应用程序代码以超级用户身份运行,这是不安全的。然而,不以超级用户身份运行意味着无法绑定到端口 80 或 443。解决之道是在 Waitress 前面使用一个反向代理,例如 nginxApache httpd。如果你想在非特权端口上绑定所有外部 IP,可以不使用 --host 选项。但是,当使用反向代理时,请避免这样做,否则可能会绕过代理。0.0.0.0 不是一个有效的导航地址,你应该在浏览器中使用特定的 IP 地址。



6

http://localhost:5000/?key1=1&key2=2

return f"{request.args}"

return f"{request.args.get('key1')}"

ImmutableMultiDict([('key1', '1'), ('key2', '2')])



7

1

使用函数 而不是命令行语言


2

如果路径

先cd 

然后使用命令行语言




8

  1. 程序运行速度过快:有时候,程序执行速度非常快,导致控制台窗口在你注意之前就已经打开并关闭了。你可以尝试以下方法:
  • return 0; 前面添加一行代码 system("pause");。这会暂停程序,直到你按下任意键。
  • 或者,对程序的属性进行设置,以便让控制台窗口保持打开状态。
  1. 缺少输出语句:即使代码逻辑正确,如果没有在需要显示结果的地方加入 printfcout 等输出语句,控制台也不会显示任何结果。请确保你的脚本中包含了输出语句。



9

  1. 创建一个 Waitress 服务器脚本: 创建一个 Python 脚本,例如 my_flask_app.py,用于启动 Waitress 服务器并运行你的 Flask 应用。在脚本中,你需要导入你的 Flask 应用并使用 waitress.serve 函数来启动服务器。示例代码如下:


from my_flask_app import app # 导入你的 Flask 应用 from waitress import serve if __name__ == "__main__": serve(app, host="0.0.0.0", port=5000)


  1. 设置开机自启动: 为了实现开机自启动,你可以创建一个 Windows 服务。以下是大致的步骤:
  • 打开命令提示符(cmd)作为管理员。
  • 使用以下命令创建一个新的 Windows 服务:


sc create MyFlaskApp binPath= "C:\path\to\python.exe C:\path\to\my_flask_app.py"


  • C:\path\to\python.exe 替换为你的 Python 解释器路径,C:\path\to\my_flask_app.py 替换为你的 Flask 应用脚本路径。
  • 启动服务:


sc start MyFlaskApp


  1. 检查日志: 如果你在控制台看不到 "Serving on http://0.0.0.0:5000",请确保你的 Flask 应用已经正确运行,并且没有其他错误。你可以查看 Waitress 的日志文件或者在脚本中添加日志记录来排查问题。


10

Waitress 是一个高性能的纯 Python 编写的独立 WSGI 服务器,适用于部署 Flask 等 Web 应用。它具备以下特点:

  1. 公平调度:Waitress 确保所有等待的服务请求都有机会被处理,而不仅仅是最早的请求。
  2. 可配置的限制:你可以设置最大并发请求数和最大内存使用量,以防止资源耗尽。
  3. 低延迟:通过优化内部数据结构和算法,Waitress 能在短时间内响应新请求¹。

关于性能参数的配置,你可以使用 waitress-serve 命令行方式来启动 Waitress 服务器。以下是一些常用的选项:

  • --threads=INT:用于处理应用程序逻辑的线程数,默认为 4。
  • --backlog=INT:服务器的连接积压,默认值为 1024。
  • --recv-bytes=INT:调用时要请求的字节数 socket.recv(),默认值为 8192。
  • --send-bytes=INT:要发送到 socket.send() 的字节数,避免部分填充 TCP 数据包,默认值为 1。
  • --outbuf-overflow=INT:如果挂起的输出大于此大小,将创建临时文件,默认值为 1048576(1MB)。
  • --outbuf-high-watermark=INT:当挂起的输出大于此值时,app_iter 将暂停,并在足够的数据写入套接字以使其降至此阈值以下时将恢复,默认值为 16777216(16MB)。


11

快捷方式 和 lnk 不一样

lnk 只能cmd输入名打开 不能start打开 也不能双击打开

快捷方式 不能cmd输入名直接打开 可以start命令打开 可以双击打开

都可以转到打开文件位置


似乎是快闪关了?

试试延迟


%cd% 在echo输出到控制台之前 在自动执行时 已经显示为实际路径了。



12

在命令提示符(CMD)中切换到根目录有几种方法。以下是其中一些选项:

  1. 直接切换到根目录: 输入以下命令并按回车键,即可将目录切换到根目录:


cd\


例如,如果你的命令提示符路径为 "C:\\Users\\Victo",执行上述命令后,目录将切换到 C 盘的根目录。

  1. 返回上一级目录: 如果你想返回到上一级目录,可以输入以下命令并按回车键:


cd..


或者:


cd ..


这两个命令都可以实现相同的效果。例如,如果你当前的命令提示符路径为 "C:\\Users\\Victo",执行上述命令后,目录将切换到 "C:\\Users"。

  1. 切换到其他驱动器: 如果你当前在一个驱动器中,想要切换到另一个驱动器,可以输入驱动器名称,后跟冒号和 /d 开关,然后按回车键。例如,要从 C 盘切换到 E 盘,执行以下命令:


e: /d


注意,驱动器名称不区分大小写,可以是小写或大写。

  1. 切换到指定路径: 如果你想切换到指定路径,可以使用以下命令:
  • 切换到同一驱动器上的路径:


cd "C:\\ESD"


  • 切换到不同驱动器上的路径:


cd "E:\\Archives" e:


以上命令将分别切换到指定的目录。



  • 使用 CD 命令时,不带参数只键入 CD,会显示当前驱动器和目录。
  • 使用 /D 开关时,除了改变驱动器的当前目录外,还可以改变当前驱动器。如果命令扩展被启用,CHDIR 会将当前目录字符串转换成使用磁盘名上的大小写²³。


cd 还有很多花样细节 比如cd d: 会打印输出之前已经设定的d盘的目标位置 只待你转盘

但一般情况下不会打印输出


cd \ 给出当前盘符的根目录

与Linux不一样



当涉及到 Windows 命令行和 Linux shell 命令时,有一些功能命令在两者之间是相对应的。以下是一些常见的对应关系¹:

  1. 关机和重启
  • Windows:shutdownrebootlogoutshutdown -spoweroff
  • Linux:shutdownrebootlogoutshutdown -rpoweroff
  1. 显示用户名
  • Windows:echo %USERNAME%
  • Linux:echo $USER
  1. 安装和卸载应用程序
  • Windows:无直接对应
  • Linux:sudo apt-get install {package}sudo apt-get remove {package}
  1. 压缩和解压缩文件夹
  • Windows:zipunzip
  • Linux:zipunzip
  1. 连接到远程服务器
  • Windows:需要使用 PuTTY 客户端
  • Linux:ssh user@192.168.1.1 -p 33
  1. 列出已挂载的设备
  • Windows:net use
  • Linux:findmnt -lo source,target,fstype,label,options -t ext4
  1. 执行脚本
  • Windows:test.cmd
  • Linux:./test.sh
  1. 查看历史命令
  • Windows:F7
  • Linux:history
  1. 清屏
  • Windows:cls
  • Linux:clear
  1. 退出命令行
  • Windows:exit
  • Linux:exit


在 Windows 的命令提示符中,你可以使用 %userprofile% 来表示用户的主目录(也就是 home 目录)。具体操作如下:

  1. 打开命令提示符(按下 Win + R,输入 cmd 并按回车)。
  2. 输入以下命令,然后按回车:
cd /d %userprofile%
  1. 这将切换到你的主目录(通常是 C:\Users\<用户名>)¹³。




关于脚本命名,你可以根据你的应用程序的实际用途来选择一个有意义的名称。例如,如果你的应用程序是一个博客网站,你可以将脚本命名为 `blog_server.py`。如果是一个任务管理应用,你可以命名为 `task_manager.py`。


要将你的 Flask 应用程序作为 Windows 服务开机启动,你可以使用 pywin32 模块来创建一个 Windows 服务。以下是一些步骤:

  1. 安装 pywin32: 首先,确保你已经安装了 pywin32 模块。如果没有,你可以使用以下命令安装:
pip install pywin32
  1. 编写服务脚本: 创建一个 Python 脚本,例如 my_flask_service.py,并添加以下代码:
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import os
import sys

class MyFlaskService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'MyFlaskService'
    _svc_display_name_ = 'My Flask Service'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.is_alive = True

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.is_alive = False

    def SvcDoRun(self):
        import your_app  # 导入你的 Flask 应用程序模块
        app = your_app.app
        serve(app, host='0.0.0.0', port=5000)  # 启动 Waitress 服务器

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(MyFlaskService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(MyFlaskService)

请确保替换 your_app 为你的应用程序模块。

  1. 安装服务: 打开命令提示符(以管理员身份运行),导航到脚本所在目录,并运行以下命令:
python my_flask_service.py install

这将安装服务并将其添加到 Windows 服务列表中。

  1. 启动服务: 在服务列表中找到你的服务(名称为 "My Flask Service"),右键单击并选择 "启动"。