sys.argv 在 python PyQt4 中有什么用

what is sys.argv used for in python 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.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 arg2 sys.argv 将包含:

sys.argv[0] == "./test.py"
sys.argv[1] == "arg1"
sys.argv[2] == "arg2"

这样你就可以计算参数的数量,这将包括程序本身的名称,如上所示:

len(sys.argv) 

argc(参数计数 = 参数数量)和 argv(一个数组,或参数值列表,取决于语言)是操作系统作为参数提供给程序。在其他世界:"how it was called".

正如 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 脚本也有这些,称为 "Positional parameters":

http://www.tldp.org/LDP/abs/html/othertypesv.html

即使您的程序根本不使用任何命令行选项,无论是何种语言或 OS(除非非常,非常 外来语言),您将始终必须最低限度:

  • 一个 argc 的 1,因为,
  • argv 数字 0 将是您的程序被调用的名称 (这可能会有所不同,例如,如果您通过符号链接调用它,或者 仅仅是因为您更改了构建过程的目标二进制文件, 并且您的程序 "foo" 现在是 "bar" - 例如使用:打印输出时不要使用硬编码程序名称,而是使用 argv 数字 0).

迟早,您将编写使用 options/parameters 的程序。所以你会用到这些。示例:您可能想要添加“--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种互斥模式下:

  • "normal"模式,
  • 或"spy mode":这是特殊的,因为它需要网络 一些低级操作的管理员权限。

所以我向它添加了一个 CLI -s/--spy-mode CLI 选项。这些是可选的 argv.

在应用程序代码的开头,我检查了这个 argv -s/--spy-mode CLI 选项

  • If 运行 in "normal" mode 没有这个选项, GUI elements related 到 "spy" 模式根本就不会显示给用户,也不会显示任何 它的 class 实例化了。那是干净的,否则它会 无论如何在许多对象 instanciation/methods 中惨败 到处都是错误,因为低级调用会失败 无论如何,然后我会以非零 return 代码退出。那不是 好的。如果您可能会失败,请尽快失败。
  • 如果使用此 argv 选项 在 "spy" 模式下启动,第一件事 我在我的代码中做的是检查调用用户是否确实有这样的 "network administrator"权限,然后1/如果他没有,问题 一个明确的错误 message/popup window 解释了“你应该 拥有 blablabla 特权,blablabal 尝试 sudo blablabla”,然后 以非零 return 代码退出,或者 2/ 如果用户确实有 所需的权限,提供特殊的 "spy mode" GUI 元素和 使用它们,没问题(并隐藏大部分 GUI "normal mode" 元素,在此操作模式下无意义)。

这就是 argc/argv 的优点。

您不需要在 PyQt 应用程序中使用 sys.argv

只有当您想使用命令行参数时它才真正有用。如果你不这样做,你可以只传递一个空列表:

app = QtGui.QApplication([])

当你使用 sys.argv 时,第一个参数自动设置为脚本名称,Qt 将使用它来设置 applicationName(). The list of arguments can be accessed later via the 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'

QApplication 可以选择接受其他命令行参数,假设您有一个带有 CheckBox 和 Slider 的 PyQT 或 PySide 程序,并且您 运行 使用以下命令:

$ python3 checkbox_slider.py -style fusion  

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