简体   繁体   中英

Executing bash profile aliases from python script

I am aware that many similar questions have been posted here but none of them seems to work in my case . I have a few commands in my bash profile like below

export HEADAS=/Users/heasoft/x86_64-apple-darwin18.7.0
alias heainit=". $HEADAS/headas-init.sh"
. $HEADAS/headas-init.sh

export SAS_DIR=/Users/sas-Darwin-16.7.0-64/xmmsas
alias sas=". $SAS_DIR/setsas.sh"

sit='source ~/.bash_profile'

in which I created an alias to run them consecutively: alias prep1='sit; heainit; sas alias prep1='sit; heainit; sas alias prep1='sit; heainit; sas . This works just fine when I execute it in the command line. But I want to insert in a python script and run it from there. I am running Python (v 3.7.4) . So, as suggested in here , I tried

import subprocess

command = "prep1"
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
output = process.communicate()   
print(output[0].decode())

But I get an error saying command not found. I tried to export it in bash profile but got an error stating -bash: export: prep1: not a function

I also tried the method suggested in here , but still nothing. Related to this, I couldn't even run a shell command like below in python

epatplot set=evli.FTZ plotfile="pn_filtered_pat.ps" 2>&1 | tee pn_filtered_pat.txt

Here is my Python script attempt

command = "epatplot set=evli.FTZ plotfile="pn_filtered_pat.ps" 2>&1 | tee pn_filtered_pat.txt"
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output, error = process.communicate()

I get SyntaxError: invalid syntax . I know where this syntax error is rising from but don't know how to fix.

I am a beginner in python so I appreciate any help/guidance.

Please see this answer: https://askubuntu.com/a/98791/1100014

The recommendation is to convert your aliases to bash functions and then export them with -f to be available in subshells.

When you call Popen , execute "bash -c <functionname>" .

As for your last script attempt, you have a conflict in quotation marks. Replace the outer quotes with single quotes like this:

command = 'epatplot set=evli.FTZ plotfile="pn_filtered_pat.ps" 2>&1 | tee pn_filtered_pat.txt'
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output, error = process.communicate()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM