Reputation: 1563
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
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
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
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
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