【问题标题】:python sys.argv differentiate int and stringpython sys.argv 区分 int 和 string
【发布时间】:2026-02-05 07:50:01
【问题描述】:

简单地说,我如何在 test.py 中区分这两者:

python test.py 1
python test.py '1'

解决方法没问题。


编辑:

  1. 这个解决方法看起来很酷但太复杂了:argparse
  2. 让调用者稍后指定参数,在python代码中使用arg = input('Please enter either an integer or a string')
  3. 以及此问题的答案中提供的其他解决方法。

感谢大家的回复。每个身体 +1。

【问题讨论】:

  • 像 optparse 这样的东西不是一个选项,是吗? docs.python.org/library/optparse.html#standard-option-types
  • 您是否考虑将第一个参数设为格式字符串?像“ssiiss”这样的东西可以让你的 python 脚本知道需要两个字符串,然后是两个整数,然后是两个字符串。
  • 你一定是在开玩笑,称标准库是为此类任务而制作的,是一种“解决方法”。
  • @Roman Bodnarchuk,我不认为argparse 可以解决原来的问题,因为每个人都说这是不可能的。它可以?所以我称之为解决方法。

标签: python command-line-arguments


【解决方案1】:

引号被 shell 使用。如果你想让它们进入 python,你必须像 python test.py 1 "'2'" "'3'" 4 一样调用

【讨论】:

  • python 文件的调用者不是我,我不能告诉他们这样做。他们更喜欢1 '2' '3' 4,我必须在python代码中区分带引号的和不带引号的
  • 无法区分它们。引号是 shell 语法,绝不是参数传递方式的一部分。命令行参数始终是字符串,单独使用时不需要/包括引用和转义。
  • @Tyler Long:这是不可能的。正如 ajwood 所说,"' 被外壳消耗。 Python 解释器将始终将 1 2 3 4 作为字符串获取,无论它们在 shell 中是否有引号。
【解决方案2】:

shell 命令行不支持传递不同类型的参数。如果你想拥有不同类型参数的命令,你需要编写自己的命令行或至少你自己的命令解析器。

变体 1:

用法:python test.py "1 2 '3' '4'"

实施:

command = sys.argv[1]
arguments = map(ast.literal_eval, command.split())
print arguments

变体 2:

用法:

python test.py
1 2 '3' 4'
5 6 '7' 8'

实施:

for line in sys.stdin:
    arguments = map(ast.literal_eval, line.split())
    print arguments

(当然,您可能希望使用raw_input 来读取命令行,并在可用时使用readline,这只是一个示例。)

更好的解决方案是实际知道您希望获得什么样的参数并对其进行解析,最好使用argparse 之类的模块。

【讨论】:

    【解决方案3】:

    这是对 args 的常见处理,由 shell 执行。 "' 被忽略,因为您可以使用它们来传递,例如,几个单词作为一个参数。

    这意味着您无法在 Python 中区分 '1'1

    【讨论】:

    • 但是你没有回答我的问题:python代码中如何区分带引号和不带引号的?
    • 没有办法。引号由 shell 处理,Python 看不到它们。
    • 至少windows有办法。查看 Eugene Homyakov 的回答
    【解决方案4】:

    Windows 特定:

    # test.py
    import win32api
    print(win32api.GetCommandLine())
    

    例子:

    D:\>python3 test.py 3 "4"
    C:\Python32\python3.EXE  test.py 3 "4"
    

    然后你就可以自己解析命令行了。

    【讨论】:

    • 如果我能接受多个答案,你的肯定是其中之一。谢谢。
    【解决方案5】:

    从实验中可以看出,在调用 Python 时引号已经消失。您必须更改 Python 的调用方式。

    【讨论】:

    • 遗憾的是,这几乎是不可能的,因为我无法改变调用者的习惯。
    • 他们是如何养成做不可能的事情的习惯的?他们从哪里得到它,因为它不可能是贝壳?您是否考虑过编写自己的命令行?
    【解决方案6】:

    我不确定我是否正确,但如果您只使用整数命令行参数,您可以将其类型转换为 int。

    假设(在 *nix 中),我将程序运行为:

    ./test.py 1
    

    我可以在我的程序中说点什么

    import sys
    def main():
      a=int(sys.argv[1])
    

    【讨论】:

      最近更新 更多