python - العمواسي - افعى



تشغيل بويرشيل النصي داخل ثعبان النصي، وكيفية جعل الثعبان طباعة الإخراج بويرشيل أثناء تشغيله (2)

ليس لدي بيثون 2.7 تثبيت، ولكن في بيثون 3.3 استدعاء Popen مع Popen تعيين إلى sys.stdout عملت على ما يرام. ولكن ليس قبل أن أكون قد نجت من الظهر المائلة في الطريق.

>>> import subprocess
>>> import sys
>>> p = subprocess.Popen(['powershell.exe', 'C:\\Temp\\test.ps1'], stdout=sys.stdout)
>>> Hello World
_

https://ffff65535.com

أنا أكتب النصي الثعبان الذي يتحقق من الظروف المختلفة ويدير البرنامج النصي بويرشيل وفقا لمساعدتي في أتمتة الهجرة من ويندوز زب إلى ويندوز 7. البرنامج النصي بويرشيل يعطي الانتاج الخاصة بها إعطاء تحديثات المستخدم على ما يحدث. وأود أن تأخذ إخراج البرنامج النصي بويرشيل وطباعته كما إخراج النصي بيثون. لقد بحثت حول بعض الأسئلة التي يبدو أنها تريد أن تفعل الشيء نفسه ولكن لا يبدو أنها تعمل بالنسبة لي. في البداية حاولت استخدام

import subprocess
subprocess.call(["C:\Users\gu2124\Desktop\helloworld.ps1"])

كما اقترح هنا تشغيل وظيفة بويرشيل من البرنامج النصي بايثون لكنني اكتشفت أن هذا ينتظر البرنامج لتنفيذ أولا ولا يعطي الإخراج لذلك وجدت أنني بحاجة إلى استخدام subprocess.Popen() كما تم سوجستد هنا استخدام بوبين لتنفيذ بويرشيل النصي في بيثون، كيف يمكنني الحصول على إخراج البرنامج النصي بويرشيل وتحديثه إلى صفحة ويب؟ لذلك حاولت هذا

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'

أنا لست متأكدا تماما ما يعنيه هذا ولكن من ما أعتقد أنني أفهم بعد قراءة هذا أتريبوتيرور: المثال سترينجيو لا يوجد لديه سمة 'فيلينو' هو أنه لأنني العبث مع ستدوت بشكل غير صحيح. نظرت أكثر حول ووجدت هذا لماذا لا بلدي بيثون رمز العمل الفرعي العمل؟ حيث قال الإجابات لاستخدام 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

اعتقدت أنه قد لأنني في البداية محاولة تشغيل النصي بويرشيل من سطر الأوامر لذلك لا بد لي من فتح بويرشيل أولا. عندما اكتب هذه الأوامر مباشرة في سطر الأوامر فإنه يعمل بالطريقة التي ينبغي ولكن عند تشغيله من خلال النصي الثعبان يعطي هذا

<bound method Popen.communicate of <subprocess.Popen object at 0x00000000026E4A90>>

وهو تحسن أعتقد ولكن ليس "مرحبا العالم" كنت أتوقع. ليس لدي أي فكرة عما يجب أن أحاول القيام به بعد ذلك للحصول على هذا العمل. أي مساعدة سيكون موضع تقدير كبير

أيضا إذا كان هناك حاجة إلى البرنامج النصي بويرشيل أنا باستخدام هنا هو عليه

$strString = "Hello World"
write-host $strString

function ftest{
$test = "Test"
write-host $test
}

إديت: حاولت الترقية إلى بيثون 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 

  1. تأكد من أنه يمكنك تشغيل البرامج النصية بويرشيل (يتم تعطيلها بشكل افتراضي). من المحتمل أن تكون قد قمت بذلك بالفعل. http://technet.microsoft.com/en-us/library/ee176949.aspx

    Set-ExecutionPolicy RemoteSigned
  2. تشغيل هذا البرنامج النصي بيثون على النص البرمجي 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




stdout