大家有没有注意到,很多软件都能接收第三方应用触发命令行参数,根据参数打开想要的效果。
在windows任务管理器调取命令行列,我们同样能看到进程中有好多是带有参数的。
现在,我们用Pyqt5 (Py3.3)实现这样的效果
一. 先说说sys.argv
官方介绍
sys.argv
The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c'. If no script name was passed to the Python interpreter, argv[0] is the empty string.
To loop over the standard input, or the list of files given on the command line, see the fileinput module.
「argv」是「argument variable」参数变量的简写形式,一般在命令行调用的时候由系统传递给程序。
这个变量其实是一个List列表,argv[0] 一般是被调用的脚本文件名或全路径,和操作系统有关,argv[1]和以后就是传入的数据了。参数从1开始
一般参数由空格分隔。
二. 实现Pyqt5 获取sys.argv 命令行参数
# -*- coding: utf-8 -*- # 直接运行, 提示请在命令行中运行, 运行参数, -install -open=C:documentapple.mp3 -color=red|green|yellow from PyQt5 import QtCore, QtGui, QtWidgets import sys, os import subprocess class class_cmds(QtWidgets.QWidget): Cargv = QtCore.pyqtSignal(list) # 定义一个带list参数的signal def __init__(self, ): super(class_cmds, self).__init__() # 直接运行exe if sys.argv.__len__() == 1: self.dobexec() sys.exit() self.resize(100, 100) self.setWindowFlags(QtCore.Qt.CustomizeWindowHint) # 去掉windowHint self.setWindowIcon(QtGui.QIcon('favicon.ico')) self.Cargv.connect(self.dialogg) # 触发信号后连接到一个槽dialogg is_show_btn = '' for arg in sys.argv: if arg == '-install': is_show_btn = '安装软件!' color = arg.split('-color=') # 设置背景颜色 if color.__len__() >= 2: try: ''' palette1 = QtGui.QPalette(self) palette1.setColor(QtGui.QPalette.Background, QtGui.QColor(192, 253, 123)) # 设置背景颜色 self.setPalette(palette1) ''' self.setStyleSheet('background-color:'+color[1]) except: pass copen = arg.split('-open=') # 打开一个文件 if copen.__len__() >= 2: try: # subprocess.Popen(copen[1]) # 非阻塞, 可打开exe,但对于.mp3、xls、txt、pdf 无效 os.system(str(copen[1])) pass except: pass if is_show_btn: self.verticalLayout = QtWidgets.QVBoxLayout() self.pushButton = QtWidgets.QPushButton(is_show_btn) self.verticalLayout.addWidget(self.pushButton) self.setLayout(self.verticalLayout) self.pushButton.clicked.connect(self.ok) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() def ok(self): self.Cargv.emit(sys.argv) # 发射一个信号 def dialogg(self, list): QtWidgets.QMessageBox.about(self, '安装提示!', '可实行逻辑安装!' + list[0]) # 直接运行 def dobexec(self): QtWidgets.QMessageBox.information(None, "运行提示!", "<p>请在命令行中运行!运行参数包括:</p>" "<p><b>-install:</b>开始安装软件</p>" "<p><b>-open=path:</b>打开一个path的文件,如:-open=C:\document\apple.mp3</p>" "<p><b>-color:</b>color 显示exe背景颜色, 其中color=( red|green|yellow )</p>") if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) myclass = class_cmds() myclass.show() sys.exit(app.exec_())
程序说明
直接运行我们让程序弹出一个MessageBox,提示在命令行中运行的命令参数
参数包括三个(-install -open -color)
-install 显示一个btn,表示可以触发btn下的逻辑,比如下载、安装等
-open 打开路径下的应用
-color 让程序显示自定义背景
当在命令行中带参数运行时就能看到每个参数对应的逻辑。
打包程序
PyInstaller: 3.0.dev6
if __name__ == '__main__': from PyInstaller import __main__ params = ['-F', '-w', '--icon=favicon.ico', 'cmds.py'] __main__.run(params)
三. 运行效果
直接双击exe运行
在命令行中不带参数运行
命令行带-install 参数
点击btn
命令行带 -install 、 -color 参数
命令行带 -open 、 -color 参数