jasper77
jasper77

Reputation: 1563

Invoke make from different directory with python script

I need to invoke make (build a makefile) in a directory different from the one I'm in, from inside a Python script. If I simply do:

build_ret = subprocess.Popen("../dir1/dir2/dir3/make",
                     shell = True, stdout = subprocess.PIPE)

I get the following: /bin/sh: ../dir1/dir2/dir3/make: No such file or directory

I've tried:

build_ret = subprocess.Popen("(cd ../dir1/dir2/dir3/; make)",
                     shell = True, stdout = subprocess.PIPE)

but the make command is ignored. I don't even get the "Nothing to build for" message.

I've also tried using "communicate" but without success. This is running on Red Hat Linux.

Upvotes: 9

Views: 12210

Answers (3)

John Kugelman
John Kugelman

Reputation: 361605

I'd go with @Philipp's solution of using cwd, but as a side note you could also use the -C option to make:

make -C ../dir1/dir2/dir3/make

-C dir, --directory=dir

Change to directory dir before reading the makefiles or doing anything else. If multiple -C options are specified, each is interpreted relative to the previous one: -C / -C etc is equivalent to -C /etc. This is typically used with recursive invocations of make.

Upvotes: 12

Philipp
Philipp

Reputation: 49812

Use the cwd argument, and use the list form of Popen:

subprocess.Popen(["make"], stdout=subprocess.PIPE, cwd="../dir1/dir2/dir3")

Invoking the shell is almost never required and is likely to cause problems because of the additional complexity involved.

Upvotes: 9

Mad Scientist
Mad Scientist

Reputation: 18553

Try to use the full path, you can get the location of the python script by calling

sys.argv[0]

to just get the path:

os.path.dirname(sys.argv[0])

You'll find quite some path manipulations in the os.path module

Upvotes: 0

Related Questions