3

書いたコードの行数を数えたい。

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

何が起こったのかわかりません。

4

3 に答える 3

4

Python スクリプトにシバン行がありません。ファイルの先頭に次を追加します。

#!/usr/bin/env python

/path/to/your_script.py次に、スクリプトが にあり、実行可能ビットが設定されていると仮定すると、次を実行できるはずです。

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

または:

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

次のコメントを更新

'変更されたのは、名前にa を含むソースファイルがチェックしているディレクトリに追加され、シェルがこれを窒息させていることだと思います。

次の関数をプログラムに追加できます。

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

[ How to escape os.system() calls in Python?に対する Greg Hewgill の回答から引用 .]

そして、次のように呼び出します。

params = [shellquote(p) for p in l if os.path.splitext(p)[1] in EXT]
于 2013-08-31T03:20:11.300 に答える
1

@Johnsyweb の更新された回答には正しい診断があるようですが、正しい修正は、シェルを使用して呼び出すことではありません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#replaceing-os-popen-os-popen2-os-popen3を参照してください

于 2013-08-31T07:52:17.193 に答える
0

Python プログラムがシェル スクリプトのように解析されたようです。ヘッダーに次のようなものを追加して、Python の場所を示します。

#!/usr/bin/python

または、実行するだけpython a.pyです。

于 2013-08-31T03:21:01.840 に答える