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