sys.argv在python PyQt4中的用途是什么
说到编程,我还是个初学者,尤其是GUI编程,我还是个新手。我将python与PyQt4一起使用,并且我将遵循一个教程指南。以下代码块相对容易理解:sys.argv在python PyQt4中的用途是什么,python,qt,user-interface,python-3.x,pyqt4,Python,Qt,User Interface,Python 3.x,Pyqt4,说到编程,我还是个初学者,尤其是GUI编程,我还是个新手。我将python与PyQt4一起使用,并且我将遵循一个教程指南。以下代码块相对容易理解: import sys from PyQt4 import QtGui def window(): app = QtGui.QApplication(sys.argv) w = QtGui.QWidget() b= QtGui.QLabel(w) b.setText("Hello World!") w.setGe
import sys
from PyQt4 import QtGui
def window():
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
b= QtGui.QLabel(w)
b.setText("Hello World!")
w.setGeometry(100,100,200,50)
b.move(50,20)
w.setWindowTitle(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
我可以很好地理解这里发生的事情,但是有人能给我解释一下sys.argv实际上在做什么吗?我不想每次都盲目地把它放进去,希望它能让我的代码正常工作
sys.argv
包含启动程序时传递给程序的所有命令行参数。QApplication
的构造函数在某些情况下需要这些启动选项,例如调试 sys.argv
不是PyQt4特定的。它以列表的形式包含用于启动程序的所有命令行参数
例如,当您启动/test.py arg1 arg2sys.argv
时,将包含:
sys.argv[0] == "./test.py"
sys.argv[1] == "arg1"
sys.argv[2] == "arg2"
有了它,您可以计算参数的数量,这将包括程序本身的名称,如上图所示:
len(sys.argv)
argc
(参数计数=参数数量)和argv
(数组或参数值列表,取决于语言)是操作系统作为参数提供给程序的。在另一个世界:“它是如何被命名的”
正如cptPH的回答所明确指出的,这并不是特定于Qt
或Python
。请看这里:
对于C和C++:
对于Python:
甚至shell脚本也有这些称为“位置参数”:
即使您的程序根本不采用任何命令行选项,无论是哪种语言或操作系统(除非非常、非常奇特的),您也必须始终做到最低限度:
- a
1,因为argc
0号将是调用程序的名称 (这可能会有所不同,例如,如果您通过符号链接调用它,或 仅仅因为您更改了构建过程的目标二进制文件, 您的程序“foo”现在是“bar”-例如:打印输出时不要使用硬编码程序名,而是使用argv
number 0)argv
argc
/argv
处理它们。从Python 3手册页:
python [ -B ] [ -b ] [ -d ] [ -E ] [ -h ] [ -i ] [ -I ]
[ -m module-name ] [ -q ] [ -O ] [ -OO ] [ -s ] [ -S ] [ -u ]
[ -v ] [ -V ] [ -W argument ] [ -x ] [ [ -X option ] -? ]
[ -c command | script | - ] [ arguments ]
…对于Python解释器,这些都是可能的argv
编辑:
Qt应用程序的真实示例:
我参与开发了一个Qt网络应用程序。它可以在两种相互排斥的模式下运行:
- “正常”模式
- 或“间谍模式”:这是特殊的,因为它需要网络 某些低级操作的管理员权限
-s/--spy mode
CLI选项。这是可选的argv
在应用程序代码的开头,我检查了这个argv
-s/--spy模式
CLI选项
- 如果在没有此选项的“正常”模式下运行,GUI元素将与 “间谍”模式甚至不会显示给用户,也不会显示任何 它的类被实例化了。这是干净的,否则它会 无论如何,在许多对象实例/方法中都会失败,并且 到处都是错误,因为低级调用会失败 无论如何,然后我会用一个非零返回码退出。那不是 好。如果你可能失败,尽快失败
- 如果使用此
选项在“spy”模式下启动,第一件事 我在代码中要做的是检查调用用户是否确实有这样的 “网络管理员”权限,如果没有,则发出 一个明确的错误消息/弹出窗口,解释“您应该 拥有blabla特权,blabal尝试sudo blabla“,然后 使用非零返回码退出,或者如果用户确实有 所需的特权,提供特殊的“间谍模式”GUI元素和 将它们投入使用,没有问题(并隐藏大部分GUI“正常模式” 元素,在此操作模式下无意义)argv
argc/argv
的好处。您不需要在PyQt应用程序中使用
只有当您想使用命令行参数时,它才真正有用。如果没有,您只需传入一个空列表:
app = QtGui.QApplication([])
当您使用sys.argv
时,第一个参数将自动设置为脚本名称,Qt将使用该参数设置脚本名称。稍后可以通过以下方法访问参数列表:
输出:
$ python test.py -f foo
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'
但请注意,有些由Qt内部处理,并将自动从参数中删除:
$ python test.py -f foo -stylesheet=style.qss
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'
QApplication可以选择性地接受其他命令行参数,例如您有一个带有复选框和滑块的PyQT或PySide程序,并使用以下命令运行该程序:
$ python3 checkbox_slider.py -style fusion
您会发现样式不同,这意味着sys.argv在某些情况下具有实际用途。从官方网站查看您是否有机会给出一个示例,说明将向程序传递何种命令行参数?我想知道这跟什么有关to@KierranPurden以@KierranPurden为例,
-style x
将强制应用程序使用运行的stylex
。那篇文章中还有很多其他的东西对调试很有用。@KierranPurden:比如说,你用Qt编写了一个文本编辑器。然后,通常的命令行参数可能是已编辑文件的名称。这只是一个例子。这完全取决于需要通过命令行参数传递什么。但是f
$ python3 checkbox_slider.py -style fusion