【问题标题】:python3 -c with long cmd string: Trying to resolve invalid syntax带有长 cmd 字符串的 python3 -c:尝试解决无效的语法
【发布时间】:2016-07-11 09:49:42
【问题描述】:

我知道如果我将一个长 python 脚本放在一个文件中会更容易,但我正在尝试解决为什么我在 python3 -c cmd 中出现语法错误:

仅供参考:如果重要的话,我将在 OS X 上执行此操作。

我阅读了以下内容,但没有解决我的问题: python multiline command running from bash

如果从文件中执行,这是工作 python3 脚本:

import csv

with open('tmp/google_adwords_report.csv', 'r') as csvfile:
    csvfile.seek(0)
    next(csvfile)
    readCSV = csv.DictReader(csvfile)
    for row in readCSV:
        print(row)

如果在命令行python3 -c cmd 中执行,这是相同的脚本:

$ python3 -c "import csv;  with open('tmp/google_adwords_report.csv', 'r') as csvfile: csvfile.seek(0); next(csvfile);  readCSV = csv.DictReader(csvfile); for row in readCSV: print(row);"

  File "<string>", line 1
    import csv;  with open('tmp/google_adwords_report.csv', 'r') as csvfile: csvfile.seek(0); next(csvfile);  readCSV = csv.DictReader(csvfile); for row in readCSV: print(row);
                    ^
SyntaxError: invalid syntax

谢谢

【问题讨论】:

  • 根据您提供的链接,您没有完全按照工作解决方案中的说明进行操作。我跟着他们,在让它工作之前我唯一遇到的问题是缩进问题,这并不奇怪。我在每个\n 之后相应地尝试了间距,并且我得到了它的工作。通过工作...我没有收到语法错误。这就是我检查的所有功能。
  • 不相关但 csvfile.seek(0) 是一个 noop,指针已经在文件的开头,如果你在 ide 中执行该行,你会得到同样的错误。我通过在必要时添加制表符和换行符使其正常工作
  • @idjaw 我试过了:python3 -c "import csv\n\nwith open('tmp/google_adwords_report.csv', 'r') as csvfile:\n\tnext(csvfile)\n\treadCSV = csv.DictReader(csvfile)\n\tfor row in readCSV:\n\t\tprint(row)",我得到了 SyntaxError: unexpected character after line continuation character
  • @JeffTanner 这意味着新行之后的间距仍然关闭。这没有给我一个语法错误:pastebin.com/WPPaFKEx
  • @PadraicCunningham 关于csvfile.seek(0) 的好点。

标签: python macos bash command-line


【解决方案1】:

您受到 Python 中允许的单行内容的限制。有关详细信息,请参阅 Python 语言参考的复合语句部分。

基本上,有些事情是不允许的。例如:

python -c "if (1): print(1)"

没问题。但是:

python -c "if (1): if (1): print(1)"

不允许。

另外,您不能将语句与缩进子句结合使用。所以,这也不行:

python -c "print(1); if (1): print(1)"

这就是你遇到的问题。

如果你在一个支持字符串延续的 shell 中,你可以这样做:

# python3 -c "if (1):
>   if (1):
>     print(1)
> "
1

另一件可能对您有用的是内联 CR(通过 ^V^M)。例如:

# python3 -c "if (1):^M  if (1):^M    print(1)"
1

也就是说,我实际上是输入了 CTRL-V CTRL-M 来创建 ^M。

而且,我也在 OS X 上(Mavericks),从 bash 运行。

【讨论】:

    【解决方案2】:

    试图在一行中完成此操作是在浪费您的时间,并且在您需要更改代码时会让您感到痛苦。这在任何语言中都是如此,但由于 Python 的空白要求尤其如此。

    只需使用heredoc

    python3 << EOF
    import csv
    
    with open('tmp/google_adwords_report.csv', 'r') as csvfile:
        csvfile.seek(0)
        next(csvfile)
        readCSV = csv.DictReader(csvfile)
        for row in readCSV:
            print(row)
    EOF
    

    【讨论】:

      猜你喜欢
      • 2016-05-27
      • 1970-01-01
      • 2020-03-16
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多