什么是python PyQt4中使用的sys.argv

问题描述 投票:3回答:5

在编程方面,我还是初学者,在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究竟在做什么吗?我不想只是盲目地把它放在每一次,希望它能使我的代码工作!

python qt user-interface python-3.x pyqt4
5个回答
2
投票

argc(参数计数=参数数)和argv(数组或参数值列表,取决于语言)是操作系统作为参数提供给程序的内容。在其他世界:“如何被称为”。

正如cptPH的回答清楚地说明的那样,这不是QtPython所特有的。看看这里:

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选项

  • 如果在没有此选项的情况下以“正常”模式运行,则与“间谍”模式相关的GUI元素甚至不会显示给用户,也不会显示其任何类别。这很干净,因为否则它会在许多对象实例/方法中悲惨地失败,在整个地方都会出错,因为低级调用无论如何都会失败,然后我会以非零返回码退出。这是不好的。如果您可能失败,请尽快失败。
  • 如果使用这个argv选项以“间谍”模式启动,我在代码中做的第一件事就是检查调用用户是否确实拥有这样的“网络管理员”权限,然后1 /如果他没有,则发出明确的错误消息/弹出窗口解释“你应该有blablabla特权,blablabal尝试sudo blablabla”,然后以非零返回码退出,或者2 /如果用户确实拥有所需的特权,则提供特殊的“间谍模式”GUI元素并使它们使用,没有问题(并隐藏了大多数GUI“正常模式”元素,在这种操作模式下毫无意义)。

这就是argc/argv的好处。


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'

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) 

0
投票

sys.argv包含在程序启动时传递给程序的所有命令行参数。 QApplication的构造函数在某些情况下需要这些启动选项,例如调试。


0
投票

QApplication可以选择接受其他命令行参数,比如你有一个带CheckBox和Slider的PyQT或PySide程序,你可以使用以下命令运行它:

$ python3 checkbox_slider.py -style fusion  

你会发现风格不同,这意味着sys.argv在某些情况下具有实际用途。从官方网站上看more argument options

© www.soinside.com 2019 - 2024. All rights reserved.