The only time you have a wrapper in this scenario is to split your string into a set of arguments.
The fact is that you do not need anything for this - you can do it more accurately and consistently!
subprocess.call([ 'curl', '-1', '-X', 'POST', '--user', 'xxx:yyy', '-d', 'status=new&content=issue+details+at%3A+http%3A%2F%2Flocalhost%3A6543%2Ftest%2Fsubmit%2F16-07-03-H-20-18-&kind=bug&title=QA+Fail&responsible=xxx&priority=critical', 'https://api.bitbucket.org/1.0/repositories/my/repo/issues' ])
It also avoids the confusion between literal and syntactic quotes: when specifying the argv literal, the literal Python string you pass is the literal string that the child process receives β there is no need to pass quotes to the shell.
This is much more reliable than starting with a string and breaking it, even with built-in built-in Python. Consider the case when your username contains spaces. List containing
'--user', 'user name:password'
... completely unambiguous, whereas
--user user name:password
... will be parsed incorrectly.
Worse would be a username containing $(rm -rf $HOME) - if you use os.system() or subprocess.Popen(..., shell=True) , this username can be executed as a command; with a literal string, you are absolutely safe.
The above is a specific error, re: libcurl, not compiled with SSL support, will not be call-specific. I would suggest checking your environment - if you have different versions of curl first in PATH or different versions of libcurl in LD_LIBRARY_PATH between your environments, this will explain this error.