source
(или .
в POSIX) - это встроенная оболочка, поэтому вам нужна оболочка для ее запуска.
Один из способов запустить ее в subprocess
- использовать shell=True
аргумент для запуска в оболочке.Но помните, source
- это bash-ism , вам лучше использовать .
, чтобы остаться в POSIX, если только ваша оболочка для входа не bash
/ zsh
.При запуске чего-либо непосредственно в оболочке, остерегайтесь последствий для безопасности, если вы точно не знаете, что собираетесь запускать.
Другой способ - запустить его как команду оболочки, например:
subprocess.run(['bash', '-c', 'source /path/to/build/conf/set_bb_env.sh'])
В данном случае это команда одноразовая , т. Е. Команда запускается в подоболочке, которая завершается после завершения выполнения команды.Таким образом, ваши параметры source
-d не будут доступны в родительской оболочке;в этом случае вы можете объединить команды для их запуска в подоболочке:
subprocess.run(['bash', '-c', 'source /path/to/build/conf/set_bb_env.sh && /run/this/command'])
Выберите метод, который соответствует вашим потребностям.