2012-02-07 25 views
5

için yürütülen yürütme komutunu yazdım Birkaç tane depoda yazıcının yeniden yazımını otomatikleştiren bir komut dosyası var.Python subprocess.Popen

Bu komut düzgün yürütüyor, ancak repo geçmişinde hiçbir şeyin değişmediğini söylüyor. Bununla birlikte, yazdırılan komutu (çalıştırılan şeyin olması gereken) alsam, onu bir kabuk betiğine bırakıp onu çalıştırırsam, geçmişi iyi değiştirir. Komutun bir şekilde doğru şekilde yürütülmediğini düşünüyorum. Alt işlem modülünün hangi komutu çalıştırdığını tam olarak görmenin bir yolu var mı?

cevap

5

shell = True'u kullandığınızda, subprocess.Popen ilk bağımsız değişkeni olarak bir dize bekler. security risk (see the Warning olabilir, bu yardımcı olabilir shell = True kullanmamak daha iyidir.

shell = True ya da shell = False kullanın, subprocess.Popen, bağımsız değişkenlerin bir listesini bekler. shlex.split:

import shlex 
import subprocess 

def filter_history(old, new, name, repoPath): 
    """Change author info 
    """ 
    # http://help.github.com/change-author-info/ 
    # http://stackoverflow.com/a/3880493/190597 
    command = """git filter-branch -f --env-filter ' 
     an="$GIT_AUTHOR_NAME" 
     am="$GIT_AUTHOR_EMAIL" 
     cn="$GIT_COMMITTER_NAME" 
     cm="$GIT_COMMITTER_EMAIL" 

     if [[ "$GIT_COMMITTER_NAME" = "{old}" ]] 
     then 
      cn="{name}" 
      cm="{new}" 
     fi 

     if [[ "$GIT_AUTHOR_NAME" = "{old}" ]] 
     then 
      an="{name}" 
      am="{new}" 
     fi 

     export GIT_AUTHOR_NAME="$an" 
     export GIT_AUTHOR_EMAIL="$am" 
     export GIT_COMMITTER_NAME="$cn" 
     export GIT_COMMITTER_EMAIL="$cm" 
     ' 
     """.format(old = old, new = new, name = name) 

    process = subprocess.Popen(
     shlex.split(command), 
     cwd = os.path.dirname(repoPath)) 
    process.communicate() 
kullanarak bir dizgeden bağımsız değişkenler listesi oluşturabilirsiniz.
İlgili konular