Python subprocess.call a bash alias

Update: Thanks for the upvotes for this hack to workaround the problem, I’m glad it’s useful. But a much better answer is tripleee’s, languishing far down the page…

If the alias you require is defined in ~/.bashrc, then it won’t get run for a few reasons:

1) You must give the ‘shell’ keyword arg:

subprocess.call('command', shell=True)

Otherwise your given command is used to find an executable file, rather than passed to a shell, and it is the shell which expands things like aliases and functions.

2) By default, subprocess.call and friends use the ‘/bin/sh’ shell. If this is a Bash alias you want to invoke, you’ll need to tell subprocess to use bash instead of sh, using the ‘executable’ keyword arg:

subprocess.call('command', shell=True, executable="/bin/bash")

3) However, /bin/bash will not source ~/.bashrc unless started as an ‘interactive’ shell (with ‘-i’.) Unfortunately, you can’t pass executable=”/bin/bash -i”, as it thinks the whole value is the name of an executable. So if your alias is defined in the user’s normal interactive startup, e.g. in .bashrc, then you’ll have to invoke the command using this alternative form:

subprocess.call(['/bin/bash', '-i', '-c', command])
# i.e. shell=False (the default)

Leave a Comment