I’m trying to run PowerShell scripts that have parameters from Python 3.7.3, but don’t know how to properly call the function in Popen
What I’m trying to do with my PowerShell script is login to Cisco routers and run Cisco IOS commands on x number of routers based on how many are defined. So the way I have my PowerShell script setup I pass in the IP address of the router like .test.ps1 177.241.87.103
when I’m using PowerShell, or powershell.test.ps1 177.241.87.103
when I’m using command prompt. Both of these commands work and get the correct output and save their outputs to text files as well.
But now I want to get Python to run this “test.ps1” script with the parameter. I’ve saved “test.ps1” to “C:Usersjgreen02” and to “C:Usersjgreen02Desktop”
import subprocess subprocess.call("powershell .\test.ps1 177.241.87.103")
I’m certain I’m using the call function incorrectly, or maybe the file I’m trying to run needs to be placed in the folder where my Python script is sitting.
The error output is:
Traceback (most recent call last): File "C:/Users/jgreen02/PycharmProjects/PortChecker/Platypus.py", line 43, in <module> subprocess.call(["powershell test.ps1 10.238.241.38"]) File "C:Usersjgreen02AppDataLocalProgramsPythonPython37-32libsubprocess.py", line 323, in call with Popen(*popenargs, **kwargs) as p: File "C:Usersjgreen02AppDataLocalProgramsPythonPython37-32libsubprocess.py", line 775, in __init__ restore_signals, start_new_session) File "C:Usersjgreen02AppDataLocalProgramsPythonPython37-32libsubprocess.py", line 1178, in _execute_child startupinfo) FileNotFoundError: [WinError 2] The system cannot find the file specified```
Advertisement
Answer
2 things wrong with the approach:
-
The arguments shown above are merely some common ones. The full function signature is the same as that of the Popen constructor …
, and specifying the arguments as a sequence rather than a string is the recommended option
When running a script, it needs to be passed via the -File option. For more details, check [MS.Docs]: About PowerShell.exe (
powershell /?
)
code00.py:
#!/usr/bin/env python3 import sys import subprocess def main(): cmd = ["PowerShell", "-ExecutionPolicy", "Unrestricted", "-File", ".\script00.ps1"] # Specify relative or absolute path to the script ec = subprocess.call(cmd) print("Powershell returned: {0:d}".format(ec)) if __name__ == "__main__": print("Python {0:s} {1:d}bit on {2:s}n".format(" ".join(item.strip() for item in sys.version.split("n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform)) main() print("nDone.")
script00.ps1:
$PSVersionTable
Output:
cfati@CFATI-5510-0:e:WorkDevStackOverflowq057115405]> "e:WorkDevVEnvspy_064_03.07.03_test0Scriptspython.exe" code00.py Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 Name Value ---- ----- PSVersion 5.1.18362.145 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.18362.145 CLRVersion 4.0.30319.42000 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 Powershell returned: 0 Done.