nunam
nunam

Reputation: 47

python remove command subprocess.call with regex

I am trying to execute rm command from python in linux as follows

remove_command = [find_executable(
            "rm"), "-rf", "dist/", "python_skelton.egg-info", "build/", "other/*_generated.py"]
print('Removing build, dist, python_skelton.egg-
if subprocess.call(remove_command) != 0:
  sys.exit(-1)

The directories gets removed successfully but the regex pattern other/*_generated.py does not remove the relevant _generated.py files.

How shall I remove those files using regex from python script?

Upvotes: 0

Views: 217

Answers (1)

JohanL
JohanL

Reputation: 6891

The reason this doesn't work the way you intend it to, is that your pattern is not expanded, but interpreted as the litteral file name "other/*_generated.py". This happens because you are relying on so-called glob pattern expansion.

The glob pattern is typically expanded by the shell, but since you are calling the rm command without using the shell, you will not get this "automatically" done. I can see two obvious ways to handle this.

Expand the glob before calling the subprocess

This can be done, using the Python standard library glob implementation:

import glob

remove_command = [find_executable("rm"), "-rf", "dist/", "python_skelton.egg-info", 
                  "build/"] + glob.glob("other/*_generated.py")
subprocess.call(remove_command)

Use the shell to expand the glob

To do this, you need to pass shell=True to the subprocess.call. And, as always, when using the shell, we should pass the command as a single string and not a list:

remove_command = [find_executable("rm"), "-rf", "dist/", "python_skelton.egg-info", 
                  "build/", "other/*_generated.py"]
remove_command_string = " ".join(remove_command) # generate a string from list
subprocess.call(remove_command_string, shell=True)

Both of these approaches will work. Note that if you allow user input, you should avoid using shell=True though, as it is a security hole, that can be used to execute arbitrary commands. But, in the current use case, it seems to not be the case.

Upvotes: 1

Related Questions