大家有沒有注意到,很多軟件都能接收第三方應用觸發命令行參數,根據參數打開想要的效果。
在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:\document\apple.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 參數