【问题标题】:what is sys.argv used for in python PyQt4sys.argv 在 python PyQt4 中的用途是什么
【发布时间】:2016-07-05 10:29:40
【问题描述】:

在编程方面我还是个初学者,而在 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


    【解决方案1】:

    您不需要在 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'
    

    【讨论】:

    • 谢谢。在阅读了 jbm's answer full info 之后,这个实际的例子很有意义。谢谢大家!
    【解决方案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 number 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 CLI 选项。这是一个可选的argv

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

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

    这就是argc/argv 的优点。

    【讨论】:

      【解决方案3】:

      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) 
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你有没有机会举例说明什么样的命令行参数会被传递给程序?我试图了解这与什么样的信息有关
        • @KierranPurden 例如,-style x 将强制应用程序使用运行的样式x。那篇文章中还有很多其他内容对调试很有用。
        • @KierranPurden:比如说,你用 Qt 编写了一个文本编辑器。然后通常的命令行参数可能是编辑文件的名称。这只是一个例子。这完全取决于您需要通过命令行参数传递什么。但为此,您可以直接阅读sys.argv。更重要的是,例如,对于如何传递主窗口的初始尺寸,窗口应用程序(在基于 Unix 的系统中)有一个约定。这就是 Qt 试图自己解决的问题——独立于你想要解决的问题。
        【解决方案5】:

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

        $ python3 checkbox_slider.py -style fusion  
        

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

        【讨论】:

          猜你喜欢
          • 2011-03-08
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          • 2014-11-08
          • 1970-01-01
          • 2012-06-03
          相关资源
          最近更新 更多