【问题标题】:When running a python script in IDLE, is there a way to pass in command line arguments (args)?在 IDLE 中运行 python 脚本时,有没有办法传入命令行参数(args)?
【发布时间】:2011-01-10 01:51:17
【问题描述】:

我正在测试一些解析命令行输入的 python 代码。有没有办法通过 IDLE 传递这个输入?目前我保存在 IDLE 编辑器中并从命令提示符运行。

我正在运行 Windows。

【问题讨论】:

  • 在命令行测试有什么问题?
  • 从 3.7.4 和 3.8.0b2 开始,在运行菜单上使用运行...自定义。

标签: python command-line-arguments python-idle


【解决方案1】:

IDLE 似乎没有提供通过 GUI 执行此操作的方法,但您可以执行以下操作:

idle.py -r scriptname.py arg1 arg2 arg3

你也可以手动设置sys.argv,比如:

try:
    __file__
except:
    sys.argv = [sys.argv[0], 'argument1', 'argument2', 'argument2']

(信用http://wayneandlayne.com/2009/04/14/using-command-line-arguments-in-python-in-idle/

【讨论】:

  • ` sys.argv = [sys.argv[0], 'argument1', 'argument2', 'argument2']` 工作正常,为什么要在 try 中读取文件路径
  • @pyd:使代码仅在从 IDLE 启动时运行
【解决方案2】:

以下是我能想到的几种方法:

1) 如果需要,您可以直接在 IDLE 控制台上使用参数调用您的“main”函数。

2) 您可以在提供参数数组的主函数调用前面添加一个测试行(或创建一个执行相同操作的单元测试),或直接设置 sys.argv。

3) 你可以在控制台上以交互模式运行python并传入参数:

C:\> python.exe -i some.py arg1 arg2

【讨论】:

    【解决方案3】:

    这段代码非常适合我,我可以在 IDLE 中使用“F5”,然后从交互式提示符再次调用:

    def mainf(*m_args):
        # Overrides argv when testing (interactive or below)
        if m_args:
            sys.argv = ["testing mainf"] + list(m_args)
    

    ...

    if __name__ == "__main__":
        if False: # not testing?
            sys.exit(mainf())
        else:
            # Test/sample invocations (can test multiple in one run)
            mainf("--foo=bar1", "--option2=val2")
            mainf("--foo=bar2")
    

    【讨论】:

      【解决方案4】:

      在紧要关头,Seth 的 #2 奏效了....

      2) 你可以在你的 main 函数调用前面添加一个测试行 提供一组参数(或创建一个单元测试来执行 同样的东西),或者直接设置 sys.argv。

      例如……

      sys.argv = ["wordcount.py", "--count", "small.txt"]
      

      【讨论】:

      • 在 IDLE shell 中运行一次 sys.argv 命令;然后使用 execfile('wordcount.py') 使用这些参数运行脚本。
      【解决方案5】:

      Visual Studio 2015 有一个 Python 插件。你可以提供论据。 VS 2015 现已免费。

      【讨论】:

        【解决方案6】:

        根据 danben 的帖子,这是我在 IDLE 中工作的解决方案:

        try:  
            sys.argv = ['fibo3_5.py', '30']  
            fibonacci(int(sys.argv[1]))  
        except:  
            print(str('Then try some other way.'))  
        

        【讨论】:

          【解决方案7】:

          命令行参数一直是added to IDLE in Python 3.7.4+。要自动检测(任何和更旧的)IDLE 版本,并提示输入命令行参数值,您可以将其粘贴(类似)到代码的开头:

          #! /usr/bin/env python3
          
          import sys
          
          def ok(x=None):
                sys.argv.extend(e.get().split())
                root.destroy()
          
          
          if 'idlelib.rpc' in sys.modules:
          
                import tkinter as tk
          
                root = tk.Tk()
                tk.Label(root, text="Command-line Arguments:").pack()
          
                e = tk.Entry(root)
                e.pack(padx=5)
          
                tk.Button(root, text="OK", command=ok,
                          default=tk.ACTIVE).pack(pady=5)
          
                root.bind("<Return>", ok)
                root.bind("<Escape>", lambda x: root.destroy())
          
                e.focus()
                root.wait_window()
          

          您可以使用常规代码来遵循这一点。 IE。 print(sys.argv)

          请注意,在 Python 3.7.4+ 中使用 IDLE 时,使用 Run... Customized 命令时,不需要import sys 必须访问argv

          如果在 python 2.6/2.7 中使用,请务必大写:import Tkinter as tk

          对于这个例子,我试图在功能和简洁之间取得平衡。根据需要随意添加或删除功能!

          【讨论】:

          • 我的另一个答案更简洁,也可以。这个提供了一个花哨的小对话框来匹配 IDLE GUI。
          • 添加谷歌日历提醒以不时更新。
          • 嘿,友好提醒后它开始移动了!让我们希望这一次它不会再次挂起。感谢您在此处引用问题和拉取请求。
          • 新更新 ;-)。已应用 5680 的修订 PR。从 3.7.4 和 3.8.0b2 开始,使用 Run ... Customized 在 Run 菜单上。
          • 感谢 TJR!你应该是BDFL。 Python就是你,你就是Python。
          【解决方案8】:

          自动检测 IDLE 并提示命令行参数

          #! /usr/bin/env python3
          
          import sys
          
          # Prompt user for (optional) command line arguments, when run from IDLE:
          if 'idlelib' in sys.modules: sys.argv.extend(input("Args: ").split())
          


          将 Python2 的“input”更改为“raw_input”。

          【讨论】:

          • 在带有 Python 3.5.2 的 Windows 10 上运行良好。
          • 我需要在空闲时捕获 KeyError(对于“idlelib”)......所以我用“try: ... except: KeyError”包围了它......你的里程可能会有所不同跨度>
          • @roetzi 我将其更改为 if/in 以防止出现错误而无需额外的麻烦。
          【解决方案9】:

          veganaiZe 的回答使用 python 3.6.3 在 IDLE 之外产生 KeyError。这可以通过将if sys.modules['idlelib']: 替换为if 'idlelib' in sys.modules: 来解决,如下所示。

          import argparse
          # Check if we are using IDLE
          if 'idlelib' in sys.modules:
              # IDLE is present ==> we are in test mode
              print("""====== TEST MODE =======""")
              args = parser.parse_args([list of args])
          else:
              # It's command line, this is production mode.
              args = parser.parse_args()
          

          【讨论】:

            【解决方案10】:

            导入系统

            sys.argv = [sys.argv[0], '-arg1', 'val1', '-arg2', 'val2']

            //如果你传递'help'或'verbose'的命令行,你可以这样说:

            sys.argv = [sys.argv[0], '-h']

            【讨论】:

              【解决方案11】:

              执行此操作的方法似乎与用户一样多。我是一个菜鸟,我只是测试了参数(有多少)。当空闲从 Windows 资源管理器启动时,它只有一个参数(...即 len(sys.argv) 返回 1),除非您使用参数启动 IDLE。 IDLE 只是 Windows 上的一个 bat 文件……指向 idle.py;在linux上,我不使用idle。

              我倾向于做的是在启动时...

              if len(sys.argv) == 1
                  sys.argv = [sys.argv[0], arg1, arg2, arg3....] <---- default arguments here
              

              我知道这是使用大锤,但如果您只是通过在默认安装中单击它来调出 IDLE,它会起作用。我所做的大部分工作都是从另一种语言调用 python,所以唯一有区别的时候就是我在测试时。

              像我这样的菜鸟很容易理解。

              【讨论】:

                【解决方案12】:

                IDLE 现在有一种 GUI 方式来向 sys.argv 添加参数!在“运行”菜单标题下选择“运行...自定义”或只是 Shift+F5...会出现一个对话框,就是这样!

                【讨论】:

                • 对不起,我按了 Shift+F5 并没有出现询问参数的窗口。请指定您的 IDLE 版本。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-08-11
                • 1970-01-01
                • 1970-01-01
                • 2015-07-03
                • 2022-10-21
                相关资源
                最近更新 更多