TypeError: execv() arg 2 must contain only strings
django内からshellを起動してるところでこのようなエラーがでました。
TypeError: execv() arg 2 must contain only strings
このような適当なサンプルを実行すると同じエラーは再現する。
sample1.py
# coding=utf-8 import subprocess args = ["python", "sample2.py", 1] print subprocess.check_output(args)
sample2.py
import sys def main(args): print args if __name__ == '__main__': main(sys.argv[1:])
コマンドラインから
$ python sample1.py
Traceback (most recent call last):
File "sample1.py", line 6, in <module>
print subprocess.check_output(args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 537, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
TypeError: execv() arg 2 must contain only strings
実際にはintを渡してるつもりは無かったんだけど、dbから返された文字列をそのまま渡していたためunicode型を含んでいたらしく、それがダメだったっぽい。
引数をstr型にしたら動くようになった
args = [arg.encode('utf-8') for arg in args]
参考: python subprocess and unicode execv() arg 2 must contain only strings - Stack Overflow