I want to add command to run python script inside Makefile.
THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
.PHONY: default analyse
analyse:
export PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools
python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py
Below is the directory structure. Among them, analyze_log.py
uses the classes in tools/fileOp.py
.
runScripts/attack_spectre/
├── analyse_log.py
└── trace.out
tools/
├── fileOp.py
├── GeneralOp.py
├── plotFig.py
├── __pycache__
│ ├── fileOp.cpython-39.pyc
│ ├── GeneralOp.cpython-39.pyc
│ └── structureOp.cpython-39.pyc
├── settingOp.py
└── structureOp.py
Makefile
I used the method below at first, but when I execute python analyse_log.py
in the directory where analyse_log.py
is, it is correct. But when I use the above Makefile to execute, then it doesn't work.
Of course I can also use absolute paths. But since I sometimes mount it in the docker image to execute, and sometimes execute it outside the image, the absolute path is not very convenient (it doesn't seem reasonable to add it directly to the system path).
How can I temporarily add the python library to the system path in the Makefile?
And I found that with the following method, I can't jump to the function definition? Is there any way to solve this?
sys.path.append(os.path.dirname(__file__) "/../../tools")
print(os.path.dirname(__file__))
from fileOp import FileOp
CodePudding user response:
Every individual logical line in a makefile is run in a different shell. This rule:
analyse:
export PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools
python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py
is run in a way equivalent to this:
/bin/sh -c 'export PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools'
/bin/sh -c 'python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py'
So, any variables you set in the first line have no effect on the second line, because they're run in a separate shell that then exits.
You need to combine both physical lines in the recipe into one logical line so they are run in the same shell. You can combine lines with backslash. So write your rule like this:
analyse:
export PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools ; \
python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py
(note the extra ; \
) and then make will run it like this:
/bin/sh -c 'export PYTHONPATH=${PYTHONPATH}:${THIS_DIR}/tools; \
python ${THIS_DIR}/runScripts/attack_spectre/analyse_log.py'