سؤال

أنا تشغيل المثبت msi في الوضع الصامت و سجلات التخزين المؤقت في ملف معين.وفيما يلي الأوامر لا تحتاج إلى تنفيذ.

C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"

كنت:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).communicate()[0]

لتنفيذ الأمر ومع ذلك لا تعترف العملية و يعطي خطأ فيما يتعلق الخطأ الخيار المحدد.لقد عبر التحقق وجدت أن الأمر لا تعمل إلا بهذه الطريقة.

هل كانت مفيدة؟

المحلول

المشكلة هو دقيق جدا.

انت تنفيذ البرنامج مباشرة.فإنه يحصل على:

argv[0] = "C:\Program Files\ My Installer\Setup.exe"
argv[1] = /s /v "/qn /lv %TEMP%\log_silent.log"

في حين كان ينبغي أن يكون:

argv[1] = "/s"
argv[2] = "/v"
argv[3] = "/qn"
argv[4] = "/lv %TEMP%\log_silent.log"

وبعبارة أخرى ، يجب أن تحصل على 5 الحجج لا 2 الحجج.

أيضا ، %TEMP% مباشرة غير معروف البرنامج!

هناك 2 طرق حل هذه المشكلة:

  1. داعيا قذيفة.

    p = subprocess.Popen('C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"', shell=True)
    output = p.communicate()[0]
    
  2. دعوة مباشرة برنامج (أكثر أمانا)

    s = ['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"']
    safes = [os.path.expandvars(p) for p in argument_string]
    p = subprocess.Popen(safes[0], safes[1:])
    output = p.communicate()[0]
    

نصائح أخرى

والمشكلة هي التي توفرها فعال SETUP.EXE مع وسيطة واحدة فقط. لا نفكر في وعاء، والسلسلة التي تسليم كحجة لا يحصل انقسم على مساحات بعد الآن، وهذا هو واجبك!

وهكذا، إذا كنت متأكدا تماما من أن "/ QN / لف٪ TEMP٪ \ log_silent.log" يجب أن يكون حجة واحدة، ثم استخدم هذا:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn /lv %TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]

وإلا (أعتقد أن هذا واحد سوف تكون صحيحة)، استخدم هذا:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn', '/lv', '%TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]

ومحاولة وضع كل حجة في سلسلة الخاصة (إخراجها لهذين):

cmd = ['C:\Program Files\ My Installer\Setup.exe',
       '/s',
       '/v',
       '"/qn',
       '/lv',
       '%TEMP%\log_silent.log"']

subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]

وأود أن أقول على الرغم من تلك التنصيص لا تبدو في الأماكن الصحيحة بالنسبة لي.

وقال لك:

subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).communicate()[0]

هل اسم الدليل حقا "يا مثبت" (مع المسافة البادئة)؟

وأيضا، كقاعدة عامة، يجب عليك استخدام مائلة في مواصفات المسار. بيثون يجب التعامل معها بسهولة (حتى على ويندوز) ويمكنك تجنب أي مشاكل مع الثعبان تفسير الخطوط المائلة العكسية كأحرف الهروب.

و(على سبيل المثال:

>>> s = 'c:\program files\norton antivirus'
>>> print s
c:\program files
orton antivirus

)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top