سؤال

لقد كنت أستخدم هذا كمرجع ، لكن غير قادر على تحقيق ما أحتاجه بالضبط: استدعاء أمر خارجي في بيثون

كنت أقرأ هذا أيضًا: http://www.python.org/dev/peps/pep-3145/

بالنسبة لمشروعنا ، لدينا 5 نقاط انقطاع التي يجب تحديثها قبل أن نتمكن من نشر تطبيقنا. في بيئة Dev ، حيث تكون عمليات النشر السريعة أكثر أهمية بالنسبة للإنتاجية من نشر الإنتاج ، كنت أعمل على تسريع العملية.

لديّ نص باش يعمل بشكل لائق ولكن لديه بعض القيود. أقوم بإطلاق العديد من تحديثات SVN مع أمر Bash التالي:

(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &

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

ومع ذلك ، ليس لدي أي سيطرة على إيقاف النشر في حالة فشل أحد التحديثات أو البناء.

سأعيد كتابة نص Bash الخاص بي مع Python ، لذا لدي المزيد من التحكم في الفروع وعملية النشر.

أنا أستخدم Subprocess.call () لإطلاق أوامر "SVN Update /REPO" ، لكن كل واحد يتصرف بالتتابع. أحاول "(SVN Update /REPO) و" وألاحظ جميعهم ، لكن رمز النتيجة يعود على الفور. لذلك ليس لدي أي وسيلة لتحديد ما إذا فشل أمر معين أم لا في الوضع غير المتزامن.

import subprocess

subprocess.call( 'svn update /repo1', shell=True )
subprocess.call( 'svn update /repo2', shell=True )
subprocess.call( 'svn update /repo3', shell=True )

أحب أن أجد طريقة لإطلاق النار على كل أمر UNIX ، وإذا فشل أي من المكالمات في أي وقت يتوقف فيه البرنامج النصي بأكمله.

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

المحلول

لا تستخدم shell=True. سوف لا داعي للاستدعاء للقذيفة للاتصال بك svn البرنامج ، وسيعطيك رمز إرجاع Shell بدلاً من SVN.

repos = ['/repo1', '/repo2', '/repo3']
# launch 3 async calls:
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos]
# wait.
for proc in procs:
    proc.wait()
# check for results:
if any(proc.returncode != 0 for proc in procs):
    print 'Something failed'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top