在编程方面,我仍然是初学者,在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实际上在做什么吗?我不想每次都盲目地把它放进去,希望它能让我的代码工作!
你不需要在 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'
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
即使你的程序根本不采用命令行选项,无论语言或操作系统是什么(除非是非常非常奇特的语言),你总是必须最低限度:
- a
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网络应用程序的开发。它可以在 2 种互斥模式下运行:
- "正常"模式,
- 或"间谍模式":这是特殊的,因为它需要网络某些低级别操作的管理员权限。
所以我添加了一个 CLI -s/--spy-mode
CLI 选项。这些是可选的argv
。
在应用程序代码的开头,我检查此argv
-s/--spy-mode
CLI 选项
- 如果在没有此选项的情况下以"正常"模式运行,则 GUI 元素相关到"间谍"模式甚至根本不显示给用户,也没有显示任何它的类实例化。这是干净的,因为否则它会无论如何,在许多对象实例化/方法中都惨遭失败,与错误无处不在,因为低级调用会失败无论如何,然后我会以非零返回代码退出。那不是好。如果可能失败,请尽快失败。
- 如果使用此
argv
选项以"间谍"模式启动,则第一件事我在我的代码中所做的是检查调用用户是否确实有这样的"网络管理员"权限,然后 1/如果他没有,则发出一个明确的错误消息/弹出窗口,解释"你应该拥有blablabla特权,blablabal尝试sudo blablabla",然后以非零返回代码退出,如果用户确实有 2/所需的权限,提供特殊的"间谍模式"GUI 元素和将它们投入使用,没问题(并隐藏大部分 GUI"正常模式"元素,在这种操作模式下毫无意义)。
这就是argc/argv
的好处。
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在某些情况下有其实际用途。 从官方网站查看更多参数选项