How do I execute a program or call a system command?

asked16 years ago
last updated1 year ago
viewed4.3m times
Up Vote5.9kDown Vote

How do I call an external command within Python as if I had typed it in a shell or command prompt?

23 Answers

Up Vote10Down Vote
Grade: A

To execute a program or call a system command from within Python, you can use the subprocess module. The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.

Here's how you can execute a system command using the subprocess module:

  1. Using subprocess.run(): The subprocess.run() function is the recommended way to execute a system command in Python. It takes the command as a list of arguments and returns a CompletedProcess object that contains information about the executed command.

    import subprocess
    
    # Execute a command
    result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    
    # Check the return code
    if result.returncode == 0:
        print(result.stdout)
    else:
        print(result.stderr)
    
  2. Using subprocess.call(): The subprocess.call() function is an older way of executing a system command. It returns the exit code of the command.

    import subprocess
    
    # Execute a command
    exit_code = subprocess.call(['echo', 'Hello, World!'])
    
    # Check the exit code
    if exit_code == 0:
        print("Command executed successfully")
    else:
        print("Command failed with exit code:", exit_code)
    
  3. Using subprocess.Popen(): The subprocess.Popen() function provides more low-level control over the executed command. It returns a Popen object that you can use to interact with the running process.

    import subprocess
    
    # Execute a command
    process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    stdout, stderr = process.communicate()
    
    # Check the return code
    if process.returncode == 0:
        print(stdout)
    else:
        print(stderr)
    

The choice of which function to use depends on your specific use case. subprocess.run() is the most straightforward and recommended approach for most use cases. subprocess.call() is simpler but provides less control, while subprocess.Popen() offers more flexibility for advanced use cases.

Remember to handle any errors that may occur during the execution of the command, such as the command not being found or encountering a non-zero exit code.

Up Vote10Down Vote
Grade: A

To execute a program or call a system command from within Python, you can use the subprocess module. The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.

Here's an example of how you can use subprocess to execute a command:

import subprocess

# Execute a command and capture the output
output = subprocess.check_output(["ls", "-l"])
print(output.decode())

In this example, we use subprocess.check_output() to execute the ls -l command. The command is passed as a list of arguments, where the first element is the command itself and subsequent elements are the command's arguments. The function runs the command, waits for it to complete, and returns the output as a byte string. We then decode the output and print it.

If you want to execute a command and interact with its input, output, and error streams in real-time, you can use subprocess.Popen():

import subprocess

# Execute a command and interact with its I/O streams
process = subprocess.Popen(["python", "script.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate(input=b"some input\n")
print(stdout.decode())
print(stderr.decode())

In this example, we use subprocess.Popen() to execute a Python script named script.py. We specify stdin, stdout, and stderr parameters to create pipes for input, output, and error streams, respectively. We can then use process.communicate() to send input to the process and retrieve its output and error streams. Finally, we decode and print the output and error messages.

Here are a few more examples of using subprocess:

# Execute a command and ignore the output
subprocess.call(["rm", "-rf", "temp/"])

# Execute a command with shell=True
subprocess.call("mkdir temp", shell=True)

# Execute a command and capture the output as a string
output = subprocess.check_output(["echo", "Hello, world!"]).decode().strip()
print(output)

In the first example, we use subprocess.call() to execute the rm -rf temp/ command, which removes the temp/ directory and its contents. We don't capture the output in this case.

In the second example, we use shell=True to execute a command through the shell. This allows us to use shell-specific features and syntax, such as redirection and piping. However, be cautious when using shell=True with untrusted input, as it can pose security risks.

In the third example, we use subprocess.check_output() to execute the echo command and capture its output as a string. We decode the output and strip any trailing whitespace before printing it.

The subprocess module provides a flexible and powerful way to execute system commands and interact with external programs from within Python. It offers various functions and options to handle different scenarios and requirements.

Up Vote10Down Vote
Grade: A

You can use the subprocess module in Python to execute a program or call a system command. Here's how:

import subprocess

# Execute a command
subprocess.run(["ls", "-l"])

# Execute a command and capture its output
output = subprocess.check_output(["ls", "-l"])
print(output.decode("utf-8"))

# Execute a command with arguments
subprocess.run(["ls", "-l", "/path/to/directory"])

# Execute a command in a new shell
subprocess.Popen(["/bin/bash", "-c", "ls -l"])

In the above examples, ["ls", "-l"] is equivalent to typing ls -l in the terminal. You can replace "ls", "-l" with any system command or program you want to execute.

The subprocess.run() function executes a command and waits for it to complete. The subprocess.check_output() function executes a command, waits for it to complete, and returns its output as bytes. The subprocess.Popen() function executes a command in a new shell and returns a Popen object that you can use to communicate with the command.

Remember to handle exceptions properly when using these functions, especially if you're executing commands that may fail or produce unexpected output.

Up Vote10Down Vote
Grade: A

To execute an external command within Python as if you had typed it in a shell or command prompt, you can use the subprocess module, which allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. Here's how you can do it:

import subprocess

# To call a simple command like 'ls' on Unix or 'dir' on Windows
command = ['ls']  # or ['dir'] for Windows
result = subprocess.run(command, stdout=subprocess.PIPE, text=True)
print(result.stdout)

# To call a command with arguments
command = ['ls', '-l']  # or ['dir', '/w'] for Windows
result = subprocess.run(command, stdout=subprocess.PIPE, text=True)
print(result.stdout)

# To call a command and handle the output and errors
command = ['ls', '-l', '/nonexistent_directory']
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode == 0:
    print("Output:", result.stdout)
else:
    print("Error:", result.stderr)

# To interact with the command (send input, read output/error)
process = subprocess.Popen(['bash'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate('echo "Hello, World!"\n')
print(stdout)

Here's a breakdown of the functions and parameters used:

  • subprocess.run(): This function is the recommended way to run a new subprocess and wait for it to complete.

    • command: A list or string containing the command to execute and its arguments.
    • stdout: Specifies the handling of the command's standard output. subprocess.PIPE means it will be captured.
    • stderr: Similar to stdout, but for standard error.
    • text: If True, the captured output will be returned as a string rather than bytes.
    • returncode: The exit code of the process, where 0 typically indicates success.
  • subprocess.Popen(): This class is used for more complex interactions with the subprocess, allowing for asynchronous execution and communication.

    • stdin, stdout, stderr: These parameters can be set to subprocess.PIPE to create pipes for input/output/error streams.
    • communicate(): This method sends data to stdin and reads from stdout and stderr until the end-of-file is reached. It is designed to prevent deadlocks in the communication.

Remember to always validate and sanitize any input that will be passed to shell commands to prevent shell injection vulnerabilities.

Up Vote9Down Vote
Grade: A

To execute a program or call a system command from within Python, you can use the subprocess module. This module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.

Here's an example of how to use the subprocess.run() function to execute a command:

import subprocess

# Run a command and capture its output
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
print(result.stdout.decode())  # Print the captured output

# Run a command and wait for it to complete
subprocess.run(['mkdir', 'new_directory'])

In the above example, subprocess.run(['ls', '-l'], stdout=subprocess.PIPE) runs the ls -l command and captures its output. The stdout=subprocess.PIPE argument tells the function to capture the standard output of the command.

The subprocess.run(['mkdir', 'new_directory']) line runs the mkdir new_directory command and waits for it to complete before moving on to the next line of code.

If you need to pass shell commands that involve pipes, redirections, or other shell-specific syntax, you can use the shell=True argument:

import subprocess

# Run a shell command
result = subprocess.run('ls -l | grep .py', shell=True, stdout=subprocess.PIPE)
print(result.stdout.decode())

In this case, subprocess.run('ls -l | grep .py', shell=True, stdout=subprocess.PIPE) runs the shell command ls -l | grep .py and captures its output.

Note: Using shell=True can be a security risk if you're passing user input as part of the command string. It's generally safer to pass the command and arguments as a list instead.

Alternatively, you can use the subprocess.call() function, which is a convenient wrapper around subprocess.run() for running commands and waiting for them to complete:

import subprocess

# Run a command and wait for it to complete
subprocess.call(['rm', 'file.txt'])

The subprocess.call() function returns the exit code of the command, which can be useful for checking if the command executed successfully.

By using the subprocess module, you can execute external programs and system commands from within your Python scripts, making it a powerful tool for automating tasks and integrating with other software.

Up Vote9Down Vote
Grade: A

You can use the subprocess module:

  1. First, import the required modules: Import subprocess and also os to capture the output, if needed.

  2. Use the subprocess.run() function with the desired command as an argument to execute the external command. You can also include additional arguments such as shell=True (not recommended for security reasons) or stdin, stdout, and stderr to capture the command's input/output.

  3. To capture the output of the command, use the subprocess.run() return code and store it in a variable or print it.

Here's an example:

import subprocess

# Execute 'ls -l' command and don't capture output
subprocess.run(['ls', '-l'])

# Capture output of 'python --version' command
output = subprocess.run('python --version', shell=True, capture_output=True)
print(output.stdout)
Up Vote9Down Vote
Grade: A

Sure, here's how you call an external command within Python as if you had typed it in a shell or command prompt:

import subprocess

# Specify the external command
command = "ls -l"

# Execute the command and capture the output
result = subprocess.run(command, capture_output=True)

# Print the results
print(result.stdout)

Explanation:

  • subprocess module: This module is used to run external commands and capture their output.
  • subprocess.run(): This function runs the command with the shell=True argument, which allows you to pass the entire command as a string.
  • capture_output=True: This argument tells the function to capture the output of the command and store it in the result variable.
  • print(result.stdout): This line prints the results of the command execution to the console.

Example Usage:

Suppose you have a file named my_file.txt containing the following content:

Hello, world!

You can call the following command from your Python script:

call_command = "python my_script.py"
subprocess.run(call_command, capture_output=True)

This command will execute the my_script.py script and print its output to the console.

Note:

  • The subprocess module may require the shell module to be installed. You can install it using pip install python3-shell.
  • The capture_output option allows you to specify whether to capture the command output or just the return code.
  • You can use different arguments and options to customize the command execution.
  • The subprocess module can be used to execute commands on Windows systems as well.
Up Vote9Down Vote
Grade: A

Sure, here's how to call an external command within Python as if you had typed it in a shell or command prompt:

import os

# Replace "command" with the actual command you want to run
command = "ls -l"

# Execute the command using the os.system function
os.system(command)

Here's a breakdown of the code:

  1. import os: The os module provides functions for interacting with the operating system, including the ability to execute external commands.
  2. command = "ls -l": Define the command you want to execute, in this case, "ls -l" to list the files and directories in the current directory.
  3. os.system(command): This function takes a command string as input and executes it as if it were typed directly into the shell.

Example:

import os

command = "echo hello, world!"

os.system(command)

# Output:
# hello, world!

Note:

  • You need to have the command or program you want to call available on your system's PATH.
  • The os.system function will capture the output of the command and return it as a string, which you can store and use for further processing.
  • If the command returns an error, it will raise a SystemError exception.

Additional Tips:

  • Use the os.popen function if you need to read and write data to the command's output.
  • Use the shlex module to parse and execute shell commands more precisely.
  • Use thesubprocess module for more advanced interaction with external processes.

Here are some additional examples:

# Execute a bash command
os.system("bash -c 'echo hello, world'")

# Execute a python script
os.system("python my_script.py")

# Execute a command with arguments
os.system("mv file1.txt file2.txt")

Please let me know if you have any further questions.

Up Vote9Down Vote
Grade: A

To execute a program or call a system command from Python, you can use the subprocess module which allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. Here is a step-by-step guide on how to use it:

  1. Import the Subprocess Module: First, you need to import the subprocess module into your Python script.

    import subprocess
    
  2. Using subprocess.run: The subprocess.run() function is a simple way to run a command. It executes the command and waits for it to complete, then returns a CompletedProcess instance.

    result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
    print(result.stdout)
    
  3. Handling Errors: Check if the command was successful by checking the returncode. A returncode of 0 typically means that the command was successful.

    if result.returncode != 0:
        print("Error:", result.stderr)
    
  4. Running Shell Commands: If you need to run commands through the shell (to use shell features like wildcards or built-in commands), you can pass shell=True.

    result = subprocess.run('echo Hello, World!', shell=True, capture_output=True, text=True)
    print(result.stdout)
    
  5. Using subprocess.Popen: For more complex interactions with subprocesses, such as non-blocking execution or if you need to interact with the process (send input, read output intermittently), use subprocess.Popen.

    with subprocess.Popen(['grep', 'python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True) as proc:
        stdout, stderr = proc.communicate('This is a test string with python in it')
        print(stdout)
    

These methods should help you execute system commands and handle their outputs within your Python programs effectively.

Up Vote9Down Vote
Grade: A

You can use the subprocess module in Python to execute a program or call a system command. Here's how:

  • Using subprocess.call():
import subprocess
subprocess.call(["command", "arg1", "arg2"])
  • Using subprocess.run() (Python 3.5+):
import subprocess
subprocess.run(["command", "arg1", "arg2"])
  • Using os.system():
import os
os.system("command arg1 arg2")

Note: Replace "command" with the actual command you want to execute, and "arg1" and "arg2" with the actual arguments.

For example, to execute the ls command, you can use:

import subprocess
subprocess.run(["ls", "-l"])

This will execute the ls command with the -l option.

Up Vote9Down Vote
Grade: A

In Python, you can call system commands using the subprocess module. Here's an example of how to execute a system command as if it was run in a shell or command prompt:

  1. Import the subprocess module at the beginning of your python file:
import subprocess
  1. Use one of these functions based on the output you expect:
    • subprocess.call(args, shell=True): This function will run the command as a single string and return the exit status. It is suitable when no output from the command is expected.
    • subprocess.run(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE): This function returns a named tuple containing the process itself, its returned error code, standard input and output streams, and their corresponding bytes-based encodings. It's recommended for more complex use cases where you want to read/write from/to the command's streams.
  2. Write the system call within your Python script:
# Using subprocess.call(...) with shell=True
subprocess.call('ls -l', shell=True)

# Using subprocess.run(...) and capturing the output (stdin, stdout, and sterr are None by default)
result = subprocess.run('ls -la', shell=True, capture_output=True)
print("Output: ", result.stdout.decode())
print("Error: ", result.stderr.decode())
print("Exit Code: ", result.returncode)

Replace 'ls -l' or 'ls -la' with the command you want to run on your system. The shell=True argument allows Python to execute a shell command directly instead of treating it as an arg list (which would require proper quoting for spaces and special characters). Note that using shell=True might have security concerns as it could allow code injection if executed from untrusted input, so ensure you understand the implications.

Up Vote9Down Vote
Grade: A

Use the subprocess module in the standard library:

import subprocess

# for simple commands
subprocess.run(["ls", "-l"]) 

# for complex commands, with many args, use string + `shell=True`:
cmd_str = "ls -l /tmp | awk '{print $3,$9}' | grep root"
subprocess.run(cmd_str, shell=True)

The advantage of subprocess.run over os.system is that it is more flexible (you can get the stdout, stderr, the "real" status code, better error handling, etc...). Even the documentation for os.system recommends using subprocess instead:

The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. See the Replacing Older Functions with the subprocess Module section in the subprocess documentation for some helpful recipes. On Python 3.4 and earlier, use subprocess.call instead of .run:

subprocess.call(["ls", "-l"])
Up Vote8Down Vote
Grade: B

Use the subprocess module in the standard library:

import subprocess

# for simple commands
subprocess.run(["ls", "-l"]) 

# for complex commands, with many args, use string + `shell=True`:
cmd_str = "ls -l /tmp | awk '{print $3,$9}' | grep root"
subprocess.run(cmd_str, shell=True)

The advantage of subprocess.run over os.system is that it is more flexible (you can get the stdout, stderr, the "real" status code, better error handling, etc...). Even the documentation for os.system recommends using subprocess instead:

The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. See the Replacing Older Functions with the subprocess Module section in the subprocess documentation for some helpful recipes. On Python 3.4 and earlier, use subprocess.call instead of .run:

subprocess.call(["ls", "-l"])
Up Vote8Down Vote
Grade: B
import subprocess

subprocess.run(["ls", "-l"])
Up Vote8Down Vote
Grade: B

Using subprocess.call()

import subprocess

# Execute a command and wait for it to complete
subprocess.call("echo Hello world")

Using subprocess.Popen()

import subprocess

# Execute a command and get its return code
process = subprocess.Popen("echo Hello world", shell=True)
return_code = process.wait()

Using os.system()

Caution: Using os.system() is not recommended as it can be insecure and lead to unexpected behavior.

import os

# Execute a command and wait for it to complete
os.system("echo Hello world")

Customizing Shell Environment

To customize the shell environment in which the command is executed, use subprocess.Popen() with the shell=True and env arguments.

import subprocess

# Set environment variables and execute a command
environment = {"MY_VAR": "value"}
process = subprocess.Popen("echo $MY_VAR", shell=True, env=environment)

Capturing Output

To capture the output of the command, use subprocess.Popen() with the stdout and stderr arguments.

import subprocess

# Execute a command and capture its output
process = subprocess.Popen("echo Hello world", stdout=subprocess.PIPE)
output = process.communicate()[0]

Handling Errors

To handle errors from the command, check the returncode attribute of the subprocess.Popen() object.

import subprocess

# Execute a command and check its return code
process = subprocess.Popen("non-existing-command")
if process.returncode != 0:
    print("Error executing command")
Up Vote8Down Vote
Grade: B

You can execute a program or call a system command in Python by using the subprocess module. Here's how you can do it:

  1. Import the subprocess module:

    import subprocess
    
  2. Use the subprocess.run() function to execute the command:

    subprocess.run(["command", "argument1", "argument2"], check=True)
    

    Replace "command", "argument1", "argument2", etc., with the actual command and arguments you want to run.

  3. If you want to capture the output of the command, you can use the subprocess.check_output() function:

    output = subprocess.check_output(["command", "argument1", "argument2"]).decode("utf-8")
    

    This will capture the output of the command as a string.

  4. If you need to interact with the process more extensively, you can use the subprocess.Popen class:

    process = subprocess.Popen(["command", "argument1", "argument2"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    

    This allows for more control over the process.

Remember to handle exceptions and errors appropriately when using subprocess calls.

Up Vote8Down Vote
Grade: B

In Python, you can use the subprocess module to execute an external program or call a system command. The subprocess.run() function is a convenient way to start a subprocess, gather its output, and check its return code. Here's the function signature:

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, universal_newlines=None, **other_popen_kwargs)

Let's say you want to call the ls command (which lists files and directories) in a Unix-like operating system. Here's an example using subprocess.run():

import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

print(result.stdout)

In this example, ['ls', '-l'] is the command you'd like to execute, similar to how you'd type it in the terminal. The capture_output=True argument tells Python to capture the output and return it as a bytestring. The text=True argument makes the output a normal string, which is usually more convenient to work with.

If you need to run a command that requires input, use the input argument. Here's an example of running bc (a command-line calculator) to perform a calculation:

import subprocess

result = subprocess.run(['bc'], input='100 * 2\n', capture_output=True, text=True)

print(result.stdout)

Note that the command is terminated by a newline character (\n). The input argument expects a string, and bc requires a newline to perform the calculation.

Keep in mind that using the shell=True argument can be risky, as it can lead to shell injection vulnerabilities. However, if you must use it, you can do something like this:

import subprocess

result = subprocess.run('ls -l $HOME', shell=True, capture_output=True, text=True)

print(result.stdout)

This is equivalent to running ls -l $HOME in a terminal. However, avoid using shell=True when possible, as it's generally safer to pass a list of arguments instead.

To summarize, the subprocess module provides a powerful and flexible way to call system commands within Python. Remember to use subprocess.run() and pass a list of arguments when possible, and avoid using shell=True if you can.

Up Vote8Down Vote
Grade: B

To execute an external command within Python, you can use the subprocess module. Here's how to do it step by step:

  1. Import the subprocess module:
import subprocess
  1. Use the run() function from the subprocess module and pass your command as a list of arguments, like this:
subprocess.run(["command", "arg1", "arg2"])
  1. If you want to capture the output of the command, use the check_output() method instead:
output = subprocess.check_output(["command", "arg1", "arg2"])
print(output)
  1. To run a shell command and redirect its input/output, you can pass additional arguments to the run() function like this:
subprocess.run("command arg1 arg2", shell=True, check=True, text=True)

Remember that using shell=True may pose a security risk if not used carefully. Always validate and sanitize your inputs when executing external commands to avoid potential vulnerabilities.

Up Vote8Down Vote
Grade: B

In Python, you can call an external command using subprocess module. Here's a general example of how to use subprocess module to call an external command in Python:

import subprocess

# Call the external command using subprocess
output = subprocess.run(["ls", "-l"])[0]
print(output.decode('utf-8')))

In this example, we're using subprocess.run() method to execute the external command (ls -l) and print its output in a human-readable format. You can replace the external command (ls -l) with any other external commands that you need to call within Python.

Up Vote7Down Vote
Grade: B

In Python, there are a few ways to execute an external command or system program. The os and subprocess modules are the standard approaches for doing this in Python.

The os module provides low-level access to operating system functionality like the ability to call commands directly with the os.system function. This is a basic method of executing a command without additional configuration.

The subprocess module, on the other hand, provides more advanced options for executing external commands in Python, such as piping output between them, setting environment variables, and controlling the child process's behavior. It also supports executing commands asynchronously, so you can run multiple commands at the same time or wait for a command to complete before continuing with your script.

Up Vote6Down Vote
Grade: B
  • Import the subprocess module.
  • Use the subprocess.call() function.

Example:

import subprocess

# Call the dir command and wait for it to complete
subprocess.call(["dir"], shell=True)
Up Vote6Down Vote
Grade: B
import subprocess

subprocess.run(["ls", "-l"])
Up Vote5Down Vote
Grade: C

There are two ways to achieve this in Python. You can either use the built-in function os or import subprocess module. Here we show you how to do it using both methods:

  1. Using os.system(): This method runs a command through your operating system's shell and is usually slower than other functions for calling external programs, but works perfectly fine if all you want is to run some command without interacting with its inputs or outputs.

Here's an example where we are executing a 'dir' command in Python on Windows:

import os 
os.system('dir')   # On windows

This will list the directory contents but remember it operates under your default shell, and won't work for complex commands or scripting tasks. For more sophisticated interaction with commands output use subprocess module below.

  1. Using subprocess: This is a higher-level module that provides more robust means to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. It should be preferred over the os.system() when you want more flexibility in working with complex commands or scripts.

Here's how you can use subprocess:

import subprocess 
subprocess.call(["ls", "-l"])   # On Unix-based system
# If a Windows, for dir command you would do:
subprocess.call(["dir"], shell=True) 

In this code, subprocess.call() runs the passed list as a new process. You can see that for the ls -l example we are using unix-based syntax. On windows to mimic 'dir' command, we had to use shell=True.

Always remember about security implications when working with external commands through Python: be careful with user input and verify and sanitize data before sending it off to a new process if possible. This could potentially lead to serious security issues if misused. Always ensure that what you're doing is trustworthy, especially when using things like subprocess.call().