2017-09-02 3 views
0
def monkey_patch_string(file_name, old_string, new_string): 
    # Read in the file 
    with open(file_name, 'r') as f : 
     filedata = f.read() 

    # Replace the target string 
    filedata = filedata.replace(old_string, new_string) 

    # Write the file out again 
    with open(file_name, 'w') as f: 
     f.write(filedata) 

if __name__ == '__main__': 

    file_name = sys.argv[1] 
    old_string = sys.argv[2] 
    new_string = sys.argv[3] 
    monkey_patch_string(file_name, old_string, new_string) 

J'ai ce fichier que j'utilise comme un processus pour remplacer les chaînes pendant le déploiement. Son exécution est faite à distance via un script de tissu.Chaîne à remplacer dans python ubuntu ne fonctionne pas

old_string = '"{}"'.format('$CONFIG_DIR') 
new_string = '"{}"'.format('$CONFIG_DIR --logfile /var/www/' + domain_name + '/logs/transmission.log') 
run('python deployment/monkey_patch.py /etc/default/transmission-daemon '+ old_string + ' ' + new_string) 

Mais plutôt que de remplacer l'ancienne chaîne à la nouvelle chaîne remplace le fichier entier avec des valeurs de déchets de la nouvelle chaîne.
J'ai même copié le fichier à mes fenêtres env et répété exactement les mêmes étapes et cela fonctionne mais sur Ubuntu. Pendant tout ce temps, je suis un utilisateur root et de toute façon il écrit quelque chose dans le fichier, donc ce n'est pas un problème de permission.

J'ai essayé ce fichier pour d'autres chaînes et fichiers et cela fonctionne. Je soupçonne que c'est quelque chose à voir avec le symbole du dollar et le module de tissu, mais je n'arrive pas à comprendre exactement. Quelqu'un a la moindre idée?

Répondre

0

C'est la façon dont le tissu exécute les commandes par ex. Le fait de citer la chaîne dans l'espace de commande était en train de créer le problème. Essentiellement c'est le problème de citation de chaîne. Résolu à l'aide de tuyaux.

import pipes 
old_string = pipes.quote('$CONFIG_DIR') 
new_string = pipes.quote('$CONFIG_DIR --logfile /var/www/' + domain_name + '/logs/transmission.log')