在编程方面,我还是初学者,在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究竟在做什么吗?我不想只是盲目地把它放在每一次,希望它能使我的代码工作!
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
number 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
的好处。
您不需要在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'
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)
sys.argv
包含在程序启动时传递给程序的所有命令行参数。 QApplication
的构造函数在某些情况下需要这些启动选项,例如调试。
QApplication可以选择接受其他命令行参数,比如你有一个带CheckBox和Slider的PyQT或PySide程序,你可以使用以下命令运行它:
$ python3 checkbox_slider.py -style fusion
你会发现风格不同,这意味着sys.argv在某些情况下具有实际用途。从官方网站上看more argument options