为什么我在运行 Python 程序时收到“sh: 1: 语法错误:未终止的引号字符串”?

mae*_*ual 4 python shell

我想统计一下我写了多少行代码。

这是Python代码:

import os
import sys

EXT = ['.c','.cpp','.java','.py']

def main():
    l = []
    if os.path.isdir(sys.argv[1]):
        for root, dirs, files in os.walk(sys.argv[1]):
            l.extend([os.path.join(root, name) for name in files])
    else:
        l.append(sys.argv[1])

    params = ["'"+p+"'" for p in l if os.path.splitext(p)[1] in EXT]

    result = os.popen("wc -l %s "%" ".join(params)).read()
    print result

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

在此之前,它按预期运行。但今天,它给了我这个错误:

sh: 1: Syntax error: Unterminated quoted string
Run Code Online (Sandbox Code Playgroud)

我不知道发生了什么事。

Joh*_*web 5

您的 Python 脚本缺少shebang行。将以下内容添加到文件顶部:

#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)

然后你应该能够运行以下命令,假设你的脚本位于/path/to/your_script.py并且它设置了可执行位

/path/to/your_script.py arg1 arg2 [...]
Run Code Online (Sandbox Code Playgroud)

或者:

python /path/to/your_script.py arg1 arg2 [...]
Run Code Online (Sandbox Code Playgroud)

更新以下评论

我怀疑发生的变化是名称中包含 a 的源文件'已添加到您正在检查的目录中,并且 shell 对此感到窒息。

您可以将以下功能添加到您的程序中:

def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"
Run Code Online (Sandbox Code Playgroud)

[摘自Greg Hewgill如何在 Python 中转义 os.system() 调用?.]

并这样称呼它:

params = [shellquote(p) for p in l if os.path.splitext(p)[1] in EXT]
Run Code Online (Sandbox Code Playgroud)