powershell 스크립트 내에서 powershell 스크립트 실행, python이 실행 중에 powershell 출력을 인쇄하도록 하는 방법
Windows XP에서 Windows 7으로의 마이그레이션을 자동화할 수 있도록 다양한 조건을 확인하고 그에 따라 PowerShell 스크립트를 실행하는 Python 스크립트를 작성하고 있습니다.파워셸 스크립트는 자체 출력을 제공하여 사용자에게 발생한 상황에 대한 업데이트를 제공합니다.powershell 스크립트의 출력물을 python 스크립트의 출력물로 출력하고 싶습니다.저는 같은 일을 하고 싶어하는 것처럼 보이는 몇 가지 질문들을 둘러보았지만, 그것들은 저에게 효과가 없는 것 같습니다.처음에 사용하려고 했습니다.
import subprocess
subprocess.call(["C:\Users\gu2124\Desktop\helloworld.ps1"])
여기서 제안한 대로 Python 스크립트에서 PowerShell 함수를 실행하지만 이것이 프로그램이 먼저 실행될 때까지 대기하고 출력을 제공하지 않으므로 사용해야 한다는 것을 알게 되었습니다.subprocess.Popen()
여기서 제안한 대로 Popen을 사용하여 Python에서 Powershell 스크립트를 실행합니다. Powershell 스크립트의 출력을 가져오고 웹 페이지로 업데이트하려면 어떻게 해야 합니까?그래서 저는 이것을.
import subprocess
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=sys.stdout)
그리고 나는 이 오류를 받습니다.
Traceback (most recent call last):
File "C:\Users\gu2124\Desktop\pstest.py", line 5, in <module>
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.py1"], stdout=sys.stdout)
File "C:\Python27\lib\subprocess.py", line 701, in __init__
errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
File "C:\Python27\lib\subprocess.py", line 848, in _get_handles
c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
File "<string>", line 523, in __getattr__
File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 150, in __getattr__
return syncreq(self, consts.HANDLE_GETATTR, name)
File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\netref.py", line 71, in syncreq
return conn.sync_request(handler, oid, *args)
File "C:\Program Files\PyScripter\Lib\rpyc.zip\rpyc\core\protocol.py", line 434, in sync_request
raise obj
AttributeError: DebugOutput instance has no attribute 'fileno'
나는 이것이 무엇을 의미하는지 완전히 확신할 수 없지만 이 속성 오류: 문자열을 읽고 이해했다고 생각합니다.IO 인스턴스에 'fileeno' 속성이 없습니다. 이는 내가 stdout을 잘못 조작하고 있기 때문입니다.좀 더 둘러봤는데 이것을 발견했습니다. 왜 제 파이썬 하위 프로세스 코드가 작동하지 않습니까?답이 사용되는 곳.stdout=subprocess.PIPE
그래서 저는 이것을.
import subprocess
subprocess.Popen(["C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
이것 또한 출력을 제공하지 않습니다. 마침내 저는 이 http://www.pythonforbeginners.com/os/subprocess-for-system-administrators 을 보고 제 코드를 이것으로 바꿨습니다.
import subprocess
p = subprocess.Popen(["powershell","C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
print p.communicate
처음에는 명령줄에서 powershell 스크립트를 실행하려고 해서 powershell을 먼저 열어야 하기 때문에 그럴 수도 있다고 생각했습니다.이러한 명령을 명령줄에 직접 입력하면 원래대로 작동하지만 파이썬 스크립트를 통해 실행하면 다음과 같이 제공됩니다.
<bound method Popen.communicate of <subprocess.Popen object at 0x00000000026E4A90>>
그것은 제가 생각하기에 개선된 것이지만 제가 기대했던 "헬로 월드"는 아닙니다.이 일을 성공시키기 위해 제가 다음에 무엇을 해야 할지 모르겠습니다.어떤 도움이라도 주시면 대단히 감사하겠습니다.
또한 내가 사용하고 있는 파워셸 스크립트가 필요하다면 여기에 있습니다.
$strString = "Hello World"
write-host $strString
function ftest{
$test = "Test"
write-host $test
}
편집: 첫 번째 답변에서 제안한 것처럼 python 3.3으로 업그레이드하려고 했지만 여전히 작동하지 않습니다.는 명어를사용니다습했령 했습니다.p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)
파일이 있는 것은 확실하지만 다음 오류가 발생합니다.
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
p = subprocess.Popen(['powershell.exe', "C:\\Users\\gu2124\\Desktop\\helloworld.ps1"], stdout=sys.stdout)
File "C:\Python27\lib\subprocess.py", line 701, in __init__
errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
File "C:\Python27\lib\subprocess.py", line 848, in _get_handles
c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
UnsupportedOperation: fileno
PowerShell 스크립트를 실행할 수 있는지 확인합니다(기본적으로 사용 안 함).당신은 이미 이 일을 했을 것입니다.http://technet.microsoft.com/en-us/library/ee176949.aspx
Set-ExecutionPolicy RemoteSigned
에서 이 파이썬 합니다.
helloworld.py
:# -*- coding: iso-8859-1 -*- import subprocess, sys p = subprocess.Popen(["powershell.exe", "C:\\Users\\USER\\Desktop\\helloworld.ps1"], stdout=sys.stdout) p.communicate()
이 코드는 python3.4(또는 다른 3.x 시리즈 인터프리터)를 기반으로 하지만 python2.x 시리즈에서도 작동합니다.
C:\Users\MacEwin\Desktop>python helloworld.py
Hello World
2 3 2.7을 호출하는 파이썬 3.3을 했습니다.Popen
와 함께stdout
로 설정한.sys.stdout
잘 작동했습니다.하지만 내가 길에서 백슬래시를 피하기 전까지는 아니었습니다.
>>> import subprocess
>>> import sys
>>> p = subprocess.Popen(['powershell.exe', 'C:\\Temp\\test.ps1'], stdout=sys.stdout)
>>> Hello World
_
이전 답변 외에도, 당신의 코드를 더 쉽게 이동시킬 수 있는 몇 가지 제안이 있습니다.
설정대신을 설정하는 ExecutionPolicy
에게 전세계적으로.RemoteSigned
문제가 함) 수 Python PowerShell 인스턴스의 경우는 다음과 같습니다.
import subprocess, sys
p = subprocess.Popen('powershell.exe -ExecutionPolicy RemoteSigned -file "hello world.ps1"', stdout=sys.stdout)
p.communicate()
PowerShell 스크립트의 경로/파일 이름에 공백을 포함할 수 있는 따옴표를 적어 둡니다.
또한 위의 예와 같이 상대 경로를 사용하여 PowerShell 스크립트를 호출할 수 있습니다.경로는 Python 작업 공간 디렉토리에 상대적입니다.
이것이 내가 Popen으로부터 출력을 얻는 방법입니다.
p = subprocess.Popen(["powershell","C:\Users\gu2124\Desktop\helloworld.ps1"], stdout=subprocess.PIPE)
p_out, p_err = p.communicate()
print(p_out)
Popen.communicate()의 문서에서.함수는 튜플(stdout_data, stderr_data)을 반환합니다.
언급URL : https://stackoverflow.com/questions/21944895/running-powershell-script-within-python-script-how-to-make-python-print-the-pow
'programing' 카테고리의 다른 글
첫 번째 콜이 자동 증분인 mysql에 데이터 INFILE을 로드하는 방법은 무엇입니까? (0) | 2023.08.05 |
---|---|
적합한 메인 클래스를 찾을 수 없습니다. 'mainClass' 속성인 Springboot을 추가하십시오. (0) | 2023.08.05 |
PL/SQL의 열에 대해 반복 (0) | 2023.08.05 |
HTML 목록 유형 대시 (0) | 2023.08.05 |
다중 경로 값을 사용하는 ASP.NET MVC URL 라우팅 (0) | 2023.08.05 |