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 的回答所明确指出的,这并非特定于 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 脚本也有这些,称为 "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
在编程方面我还是个初学者,尤其是在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 的回答所明确指出的,这并非特定于 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 脚本也有这些,称为 "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