How to run a Powershell function through a Python

2019-07-15 02:06发布

I am trying to create a translator-type program in Python (this is 2.7, if that is important). I want to receive user input, translate it, and then print their output to the screen. That part is not difficult, but I also want to export it to a text file. I am using Powershell for that, with the subprocess module. The Powershell script is very short, and all it does is asks for the user to copy and paste the Python translation into an input. It then calls New-Item to create a file and gives it the value option as the Python translation.

Python code:

def translator:
    inquiry = raw_input("Leetspeak trans query: ") #Enter query
    inquiry = inquiry.lower() #Change all to lowercase, so that everything gets translated
    newPrint1 = "" #The new string that gets returned to them at the end
    level = raw_input("What type of 1337 do you want? 1 for basic, 2 for intermediate, \
    3 for intermediate-advanced, and 4 for ultimate.")

    if level == "1":
        from b4s1c_l33t import leetkey
    elif level == "2":
        from In73rm3d1473_1337 import leetkey
    elif level == "3": 
        from In7_4DV import leetkey
        from In7_4DV import combokey
    elif level == "4":
        from U17IM473_1337 import leetkey
        from U17IM473_1337 import combokey

    for char in inquiry:
        if char in leetkey:
            newPrint1 += leetkey[char]
        else: 
            newPrint1 += char #Checks to see if the char is in the single-char list, then appends it accordingly

    if int(level) >= 3:
        for item in combokey:
            if item in newPrint1:
                newPrint1 = newPrint1.replace(item, combokey[item])

    print newPrint1 #Print answer

    question = raw_input(r"Do you want to translate some more? Type Y or N  ") #Asks if they want to do more
    question = question.lower() #Changes it to lowercase, for sending through the if loop

    if question == "y" or question == "Y":
        translator() #If answer is yes, program calls the entire function again
    elif question != "y" and question != "n" and question != "Y" and question != "N":
        print "I didn't quite catch that."

    ps = raw_input("Would you like to export your leetness to a file? Type Y or N   ")

    if ps == "Y" or ps == "y": 
        import subprocess
        subprocess.call(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./1337Export.ps1\";", "&export"])

    else: 
       print r"0|<. 600|)|3`/3!"

translator() #calls the function once

Powershell script:

Function export(){
    $param = Read-Host("Copy-paste the translation from above here!   ")
    New-Item C:\Scripts\1337\1337ness.txt -type file -value $param
}

But I also know that the script was working perfectly up until I added the Powershell to it, so the problem is either in my usage of the subprocess module or in the Powershell script itself. I am a somewhat-medium-beginner at using Powershell, so any help will be greatly appreciated. Either that, or if there is a way to create the new file and write data to it in Python itself, that would be greatly appreciated.

Thanks, Prem

Note: in the Python script, the leetkey and combokey are in separate files that are imported based on the value of the variable level.

UPDATE: I looked at the page here, and the subprocess code in the Python script is what I found in that page. It did not work, but instead threw an error saying that the export function does not exist, which it obviously does... in Powershell. Thanks again!

2条回答
We Are One
2楼-- · 2019-07-15 02:44

Your parameter construction is off. You want to run the following commandline in PowerShell:

. "./1337Export.ps1"; & export

which basically means "dot-source (IOW import) the script 1337Export.ps1 from the current working directory, then call (&) the function export".

The cleanest way to do this is to put the statement in a scriptblock:

&{. "./1337Export.ps1"; & export}

and pass that scriptblock as a single argument, so your Python statement should look like this:

subprocess.call(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", '-Command', '&{. "./1337Export.ps1"; & export}'])

Of course you need to make sure that 1337Export.ps1 actually exists in the current working directory when you execute the Python script.

查看更多
戒情不戒烟
3楼-- · 2019-07-15 02:47

You have to do two things:

1) dot source the script (which is similar to python's import), and

2) subprocess.call.

import subprocess
subprocess.call(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./SamplePS\";", "&export"])

Note: I have assumed that both the .py and .ps1 are residing in the same directory and the name of the powershell script is "SamplePS" and from that script I am using the function "export"

Hope it helps

查看更多
登录 后发表回答