David Aldrich wrote: > Hi Peter > > Thanks very much for your reply. I have added one more question below. > >> The straightforward approach is to pass a list or tuple: >> >> def build(build_options=()): >> subprocess_check_call(("make",) + build_options) >> >> build(("flagA=true", "flagB=true")) > > This looks fine - I am trying it. > > I would like to display on the console the entire make command, so I have > done this: > > def build(build_options=()): > make_command = 'make '.join(map(build_options)) > print('Build command: ' + make_command) > subprocess.check_call(("make",)+build_options) > > but I get error: > > make_command = 'make '.join(map(build_options)) > TypeError: map() must have at least two arguments. > > What would be the correct way to concatenate and display the elements in > the tuple please?
Hm, what do you expect map() to achieve? And "make " is not really the string you want as a separator... You can join the strings in build_options with >>> build_options = "foo", "bar", "baz" >>> " ".join(build_options) 'foo bar baz' >>> "make " + " ".join(build_options) 'make foo bar baz' But you shouldn't do this as you have already learnt that spaces do not separate arguments; in fact by default check_call() doesn't even use the shell. An example to drive the point home: >>> from subprocess import check_call >>> check_call(["python3", "-c", "import sys; print(sys.argv[1:])", "foo", "bar"]) ['foo', 'bar'] 0 >>> check_call(["python3", "-c", "import sys; print(sys.argv[1:])", "foo bar"]) ['foo bar'] Both invocations would appear to issue the same command in your debugging print() call. list2cmdline() does a bit better; it resembles the command issued if the shell were used: >>> print(subprocess.list2cmdline(["make"] + build_options)) make foo "bar baz" -- https://mail.python.org/mailman/listinfo/python-list