Python PyQt4中sys.argv的作用是什么?

3

当涉及到编程时,我仍然是一个初学者,特别是在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实际在做什么?我不想盲目地每次都把它放进去,希望它能使我的代码工作!
5个回答

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'

请注意,一些预定义的参数会被Qt内部处理,并将自动从参数中删除:

$ python test.py -f foo -stylesheet=style.qss
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'

谢谢。在阅读了充满信息的jbm的回答之后,这个实际例子变得非常有意义。谢谢大家! - Kierran Purden

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

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 数组中的第0个元素将是程序被调用的名称 (这可能会有所变化,例如如果通过符号链接调用它, 或者仅仅是因为您更改了构建过程的目标二进制文件, 而您的程序“foo”现在是“bar” - 示例:在打印输出时不要使用硬编码的程序名称,而应使用 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网络应用程序。它可以在两种互斥模式下运行:
- “正常”模式, - 或“间谍模式”:这是特殊的,因为它需要网络管理员权限进行一些低级操作。
所以我添加了一个CLI -s/--spy-mode选项。这是一个可选的argv
在应用程序代码的开头,我检查这个argv-s/--spy-mode CLI选项。
  • 如果在“正常”模式下运行而没有使用此选项,与“间谍”模式相关的GUI元素甚至不会显示给用户,也不会实例化任何类。这是干净的,因为否则在许多对象实例化/方法中它将彻底失败,出现错误,并且由于低级调用将失败,然后我将以非零返回代码退出。那不好。如果可能失败,请尽早失败。
  • 如果使用此argv选项启动“spy”模式,我在代码中要做的第一件事情就是检查调用用户是否确实拥有“网络管理员”权限,然后1 /如果他没有,则发出明确的错误消息/弹出窗口,解释“您应该具有blablabla特权,尝试sudo blablabla”,然后以非零返回代码退出,或2 /如果用户确实拥有所需的特权,则提供特殊的“spy mode”GUI元素并将其使用,没有问题(并隐藏大部分GUI“normal mode”元素,在此操作模式下无意义)。

这就是argc/argv的作用。


0

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


你能否举个例子,说明会向程序传递哪种类型的命令行参数?我想了解这与哪种信息相关。 - Kierran Purden
2
@KierranPurden 请查看Qt关于QApplication的文档 - Aaron Christiansen
1
例如,-style x 将强制应用程序在运行时使用样式 x。该文章中还有很多其他对调试有用的选项。 - Aaron Christiansen
@KierranPurden:假设你使用Qt编写了一个文本编辑器。那么通常的命令行参数可能是所编辑文件的名称。这只是一个例子。完全取决于您需要通过命令行参数传递什么。但是,您可以直接读取sys.argv来实现这一点。更重要的是,在Unix系统中,有一个约定用于窗口应用程序,用于传递主窗口的初始尺寸,例如。而这正是Qt试图独立解决的问题--不管您想解决什么问题。 - pepr

0

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

$ python3 checkbox_slider.py -style fusion  

你会发现样式有所不同,这意味着在某些情况下sys.argv具有其实际用途。请参见官方网站的更多参数选项


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接