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