在编程方面,我还是初学者,在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.setGeometry(100,100,200,50)
b.move(50,20)
w.setWindowTitle(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
我可以关注这里发生的事情,但有人可以向我解释一下sys.argv实际上在做什么吗?我不想只是盲目地把它放在每一次,希望它能使我的代码工作!
答案 0 :(得分:8)
您不需要在PyQt应用程序中使用sys.argv。
如果您想使用命令行参数,它才真正有用。如果不这样做,您只需传入一个空列表:
app = QtGui.QApplication([])
当您使用sys.argv
时,第一个参数会自动设置为脚本名称,Qt将使用它来设置applicationName()。稍后可以通过arguments()方法访问参数列表:
# test.py
import sys
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
print('ARGS: %s' % app.arguments())
print('NAME: %r' % app.applicationName())
输出:
$ python test.py -f foo
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'
但请注意,有些pre-defined arguments由Qt内部处理,并会自动从参数中删除:
$ python test.py -f foo -stylesheet=style.qss
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'
答案 1 :(得分:2)
sys.argv
不是特定于PyQt4的。它包含用于以列表形式启动程序的所有命令行参数。
例如,当你开始 ./ test.py arg1 arg2 sys.argv
将包含:
sys.argv[0] == "./test.py"
sys.argv[1] == "arg1"
sys.argv[2] == "arg2"
有了这个你可以计算参数的数量,这将包括程序本身的名称,如上所示:
len(sys.argv)
答案 2 :(得分:2)
argc
(参数计数=参数数量)和argv
(数组或参数值列表,具体取决于语言)是操作系统为程序提供的内容作为参数。在其他世界:“如何被称为”。
正如cptPH的答案所明确指出的那样,这并非针对Qt
或Python
。看看这里:
https://en.wikipedia.org/wiki/Entry_point
对于C和C ++:
https://en.wikipedia.org/wiki/Entry_point#C_and_C.2B.2B
对于Python:
https://en.wikipedia.org/wiki/Entry_point#Python
即使shell脚本也有这些,称为“位置参数”:
http://www.tldp.org/LDP/abs/html/othertypesv.html
即使您的程序根本没有命令行选项,无论语言或操作系统如何(除非非常非常异国情调),您将始终只有最低限度:
argc
为1,因为,argv
数字0将是您的程序被调用的名称
(这可能会有所不同,例如,如果您通过符号链接调用它,或者
只是因为你改变了构建过程的目标二进制文件,
你的程序“foo”现在是“bar” - ex use:打印输出时不要使用硬编码的程序名,而是使用argv
数字0)。迟早,你将编写使用选项/参数的程序。所以你会使用这些。示例:您可能需要添加“--verbose”或“--debug”选项。或者“--input-file”如果是关于文件处理的话。随你。您的程序将在启动时解析这些argv,并通过明智的编码,相应地更改其运行时行为。
示例:即使是Python也可以使用很多可选选项,并使用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网络应用程序。它可以在2种互斥模式下运行:
所以我添加了一个CLI -s/--spy-mode
CLI选项。这些是可选的argv
。
在应用程序代码的开头,我检查了这个argv
-s/--spy-mode
CLI选项
argv
选项以“间谍”模式启动,则首先要做的事情
我在我的代码中检查调用用户确实有这样的
“网络管理员”权限,然后1 /如果他没有,发出
一个明确的错误消息/弹出窗口,解释“你应该
有blablabla特权,blablabal尝试sudo blablabla“,然后
以非零返回码退出,如果用户确实有,则退出2
所需的权限,提供特殊的“间谍模式”GUI元素和
把它们使用,没问题(并隐藏大部分GUI“正常模式”
元素,在这种操作模式中毫无意义)。这是argc/argv
的好处。
答案 3 :(得分:0)
sys.argv
包含启动时传递给程序的所有命令行参数。 QApplication
的构造函数在某些情况下需要这些启动选项,例如调试。
答案 4 :(得分:0)
QApplication可以选择接受其他命令行参数,例如您有一个带有CheckBox和Slider的PyQT或PySide程序,并使用以下命令运行它:
$ python3 checkbox_slider.py -style fusion
您会发现样式不同,这意味着sys.argv在某些情况下具有实际用途。请参阅官方网站上的more argument options