![](/img/trans.png)
[英]shows error " sh: 1: Syntax error: Unterminated quoted string " in python
[英]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.