【问题标题】:Using a conditional in the python interpreter -c command在 python 解释器 -c 命令中使用条件
【发布时间】:2012-07-29 03:37:12
【问题描述】:

我正在尝试弄清楚如何将以下条件语句传递给 python 解释器的命令选项 (-c)。

if sys.maxsize > 2**32:
    print '64'
else:
    print '32'

64

但是,我不断收到语法错误,例如:

>python -c "import sys; if sys.maxsize > 2**32: print '64' else: print '32';"
  File "<string>", line 1
    import sys; if sys.maxsize > 2**32: print '64' else: print '32';
                 ^
SyntaxError: invalid syntax

我发现很难找到这种用法的好例子。我一定在这里错过了一些大事......

【问题讨论】:

    标签: python command-line conditional


    【解决方案1】:

    经过(非常)简短的搜索,我在任何地方都找不到此文档,但似乎 -c 严格采用 表达式(即,可以出现在赋值),而不是语句。要在您的情况下解决此问题,您需要做两件事:

    1. 使用print function(函数调用是一个表达式)而不是打印语句
    2. 使用 Python 的 a if b else c conditional expression

    这给了你:

    lvc@tiamat:~$ python -c "from __future__ import print_function; import sys; print('64' if sys.maxsize > 2**32 else '32')"
    64
    

    【讨论】:

    • 我认为您的意思是“32”,但这很棒。那么,语句就等于表达式?来自 Python 文档:When called with -c command, it executes the Python statement(s) given as command. Here command may contain multiple statements separated by newlines. Leading whitespace is significant in Python statements!
    • @DevHopeful_2012 我的意思是else '32';现在修好了。手册页的那部分似乎是在说 -c 可以在解释器提示符下输入任何内容,我无法与我实际看到的内容相一致。 'Statement' 是 Python 中的 'expression' 的超集 - 参见,例如,docs.python.org/reference/expressions.html。但正如我在答案中所说,将“表达”视为“任何你可以放在= 的 RHS 上的东西”。
    【解决方案2】:

    你可以使用多行(至少在 bash 中):

    $ python -c "import sys
    > if sys.maxsize > 2**32:
    >  print '64'
    > else:
    >  print '32'"
    64
    

    要获取所有平台信息,您可以:

    $ python -mplatform
    

    或者只是一个架构:

    $ python -c "import platform; print platform.architecture()"
    ('64bit', 'ELF')
    

    【讨论】:

    • 有了架构,难道你还需要小心 OSX,解释器可以作为不同的位运行吗?我对细节很模糊,但是我看到了几个不能信任 platform.architecture() 的 cmets。 See this post
    • 这是一个bug; sys.maxsize 似乎是一个有效的解决方法(我不知道是否存在 python 可以工作的系统,但 sizeof size_t != sizeof pointer)。
    【解决方案3】:

    现有的两个答案更好,但这里有一个替代方案(使用 Python 2.7 测试):

    > python -c 'import sys; print 64 if sys.maxsize > 2**32 else 32'
    64
    

    另请参阅:Does Python have a ternary conditional operator?

    【讨论】:

    • 嗯,我认为它看起来更像这样。我相信您的回答同样优雅,我的要求仅适用于 Python 2.7 或更高版本。所以,这肯定也有效。但是,lvc 打败了你,澄清了我的误解。无论如何感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2016-11-30
    • 1970-01-01
    • 2014-03-10
    • 2011-03-01
    相关资源
    最近更新 更多