Bonjour,
je veux copier tous les fichiers d’un répertoire personnel vers un répertoire d’un logiciel accessible par mot de passe, sous Linux et avec python:
subprocess.call(['gnome-terminal', '--','sudo', '-S', 'cp','-v', path_src+"/nom1.py", path_src+"/nom2.html", path_src+"/nom3.sh", path_dest])
fonctionne correctement mais je voudrais ne pas lister tous les fichiers, donc j’ai essayé:
subprocess.call(['gnome-terminal', '--','sudo', '-S', 'cp','-v', path_src+"/*", path_dest])
qui ne fonctionne pas. Merci de me dire pourquoi ?
Bonjour,
Je trouve étrange l’idée de lancer un émulateur de terminal gnome depuis Python : chez moi je lance Python dans un émulateur de terminal, et donc ce qu’il affiche s’affiche déjà naturellement dans le terminal dans lequel il est, je n’éprouve jamais le besoin d’en ouvrir un autre.
Aussi ça rend ton programme fragile : si gnome-terminal
n’est pas installé il ne marche plus, c’est dommage, tu pourrais peut-être lancer sensible-terminal
plutôt que gnome-terminal
mais est-ce que c’est plus portable ? J’ignore.
Ensuite je trouve étrange d’utiliser sudo
pour copier des fichiers de ton répertoire personnel, es-tu sûr d’en avoir besoin ?
Finalement je trouve aussi surprenant d’utiliser subprocess
pour invoquer cp
: dans shutil
tu trouveras copytree qui fait (peut-être ?) ce que tu cherche à faire. Je pense que ton code peut donc se simplifier en :
import shutil
shutil.copytree(path_src, path_dest)
Mais j’imagine que tu as tes raisons pour utiliser sudo
et gnome-terminal
, donc je vais répondre à ta question :
“*” est interprété par un shell, hors lorsque tu exécutes gnome-terminal -- une commande
, une commande est exécutée directement, sans passer par un shell, donc sans aucun bout de code chargé de substituer l’étoile.
Tu pourrais t’en sortir en demandant explicitement d’invoquer un bash
puis à bash d’exécuter tes commandes :
gnome-terminal -- bash -c 'echo *; sleep 10'
et hop on voit que bash a remplacé l’étoile avant d’appeler echo
.
Mais ça commence à faire un sacré empilement, je ne peux m’empêcher de proposer une solution alternative pour copier tes fichiers : rsync
.
rsync
a le bon goût de ne copier que ce qui a changé entre ton dossier et ton dossier chiffré : ça peut aller très vite ! Et il s’occupera tout seul de lister les fichiers à copier, pas besoin d’étoile.
subprocess.call(['gnome-terminal', '--','sudo', '-S', 'rsync', '-a', path_src + "/", path_dest + "/"])
tu peux même demander à rsync
de supprimer dans path_dest
les fichiers qui ne sont plus dans path_src
en ajoutant l’option --delete
mais attention a ne jamais t’embrouiller dans les paramètres : rsync
a la réputation de supprimer très très vite.
Lis bien la doc de rsync
pour comprendre pourquoi j’ai mis des “/” aux arguments de rsync, ils ont leur importance, enfin surtout celui du côté de path_src
.
Bonjour @mdk,
j’utilise Geany pour écrire mes scripts et j’y installe des modèles de fichiers perso. Je suis donc obligé de donner le mot de passe root pour pouvoir copier mes modèles dans un répertoire de Geany.
C’est pourquoi dans mon script Python j’ai utilisé subprocess.call(['gnome-terminal', '--','sudo', '-S', 'cp','-v',...
ce qui n’est peut-être pas la bonne méthode …
Je ne comprends pas cette phrase, veux-tu dire que Geany t’interdit d’éditer des fichiers Python qui t’appartiendrait (et qui seraient dans ton dossier personnel) et te force a éditer des fichiers Python qui sont dans ses répertoires “ailleurs dans la hierarchie” ?
Geany possède ses propres modèles suivant la programmation utilisée et j’ajoute mes propres modèles que j’utilise ensuite pour faire mes scripts.
Je viens de corriger mon code suivant tes conseils en :
subprocess.call(['gnome-terminal', '--','sudo', 'bash', '-c', 'cp -v '+path_src+"/* "+path_dest])
et cela fonctionne.
Comment aurais-tu fais de ton côté ?
J’ignore ce que tu essaye de faire donc c’est dur de répondre. Je veux dire par là que je ne pense pas que tu essaye de juste copier path_src
vers path_dest
, mais que ça s’inscrit dans quelque chose de plus gros que j’ignore.
De mon côté j’essayerai surtout de comprendre pourquoi les fichiers ne sont pas stockés dans mon home là où j’ai des droits, pour me passer de sudo.
Ça me paraît forcément possible, mais je n’ai jamais utilisé Geany donc je suis un peu perdu, je n’ai jamais entendu parler de ses modèles. Il nous faudrait un utilisateurs de Geany pour nous éclairer
Tu es sûr de na pas pouvoir faire cette configuration dans ton répertoire utilisateur (quelque part dans ~/.config/geany
) ? General Template Information - Geany Wiki
Ça fait longtemps que je n’ai pas utilisé geany, mais je ne crois pas que tu aies besoin d’aller trifouiller dans les répertoires système (ça c’est réservé aux dépendances que tu installes au niveau de l’OS, et qui ont les droits pour ça).
En 2 mots, mon script principal comprend des modules qui font chacun une tâche et entre autre je recopie des modèles de fichiers dans LibreOffice et dans Geany (un IDE). Mais j’ai voulu installer mes propres modèles là où étaient ceux de Geany, d’où l’accès root. Ce n’est peut-être pas la bonne solution j’en conviens…Merci néanmoins pour ton aide et je vais fouiller davantage Geany.
Bonjour @entwanne,
je vais essayer de (mieux) comprendre comment ajouter des modèles dans Geany, je n’ai surement pas pigé comment il fallait faire.
J’ai effectivement déniché le répertoire de configuration utilisateur dans lequel j’ai pu recopier mes modèles. Il y a quelque temps cela ne semblait pas fonctionner comme cela, mais bon…
j’ai fait un : shutil.copytree(path2, path3, dirs_exist_ok=True)
qui fonctionne. Merci à tous !
Youhou !
Je suis très content que tu puisse te passer de sudo
, c’est beaucoup plus « normal » comme ça (et immensément moins risqué ! Un sudo rsync --delete
avec une faute de frappe dans les arguments c’est la porte ouverte à flinguer son Linux, son home, ou les deux en même temps).
grâce à vous tout s’arrange !!