繁体   English   中英

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

[英]Why I got “sh: 1: Syntax error: Unterminated quoted string” when I run my Python program?

我想算一下我写的代码行数。

这是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()

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

sh: 1: Syntax error: Unterminated quoted string

我不知道发生了什么。

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

#!/usr/bin/env python

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

/path/to/your_script.py arg1 arg2 [...]

或者:

python /path/to/your_script.py arg1 arg2 [...]

更新以下评论

我怀疑发生了什么变化的是,一个包含'名字'的源文件已被添加到你正在检查的目录中,而shell正在窒息。

您可以将以下函数添加到您的程序:

def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"

[ 取消Greg Hewgill如何在Python中调用os.system() 的回答 ]

并称之为:

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

@ Johnsyweb的更新答案似乎有正确的诊断,但正确的解决方法是不使用shell来调用wc 尝试这样的事情:

cmd = ['/bin/wc', '-l'] # Need full path!
[cmd.extend(p) for p in l if os.path.splitext(p)[1] in EXT]
result = os.popen2(cmd).read()

请注意,现在推荐使用subprocess模块。 但是,切换到需要对当前代码进行较少侵入性的更改; http://docs.python.org/2/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3

看起来你的Python程序被解析为shell脚本。 在标题处添加类似的内容以指示Python的位置:

#!/usr/bin/python

或者你只是运行python a.py

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM