2017-09-27 4 views
1

J'ai un script python dans /home/pi/update_rrd_data.py qui est supposé stocker les logs dans le dossier/home/pi/logs_rrd.Python os.path.join() ne se connecte pas correctement lors de l'utilisation du travail cron

Voilà comment je l'ai implémenté:

current_folder = os.path.dirname(os.path.abspath(inspect.stack()[0][1])) 
log_folder = os.path.join(current_folder, 'logs_rrd') 
if not os.path.exists(log_folder): os.makedirs(log_folder) 

file_name = __file__[:-3] + '_' + datetime.strftime(datetime.now(), '%Y%m%d%H%M') + '.log' 
log_file = os.path.join(log_folder, file_name) 

logging.basicConfig(filename=log_file, level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(filename)s->%(funcName)s:%(message)s', datefmt='%m/%d/%Y_%I:%M:%S_%p') 
logging.info('\nCurrent Folder: {}\nLog Folder: {}\nLog File: {}'.format(current_folder, log_folder, log_file)) 

Quand je lance le script manuellement, il fonctionne très bien, ce qui est ce que je reçois dans le fichier journal/home/pi/logs_rrd/update_rrd_data_201709271426. log:
dossier actuel:/home/pi
Connexion dossier:/home/pi/logs_rrd
fichier journal: /home/pi/logs_rrd/update_rrd_data_201709271426.log

Cependant, quand je le lance comme cron travail, les fichiers journaux sont créés dans le sam e dossier en tant que script au lieu du dossier logs_rrd. C'est ce que je reçois dans le fichier journal /home/pi/update_rrd_data_201709271445.log:
Dossier actuel:/home/pi
Connexion Dossier:/home/pi/logs_rrd
fichier journal:/home/pi/update_rrd_data_201709271445 .log

Je n'arrive pas à comprendre pourquoi la valeur du dossier de journal est correcte, mais le fichier journal supprime la partie logs_rrd du dossier de journal.

Voici comment je lance le Cron:

*/5 * * * * /usr/bin/python /home/pi/update_rrd_data.py 

Tous les dossiers et les fichiers appartiennent à root donc il ne devrait pas y avoir de problèmes d'autorisation d'écriture.

+1

Avez-vous essayé d'utiliser '__file__' à la place' inspect.stack() [0] [1] '? – AndMar

+0

@AndMar Oui je l'ai fait, mais le dossier actuel devient/root. En outre, les valeurs du dossier actuel et du dossier de journal sont correctes dans les deux cas. C'est quand j'essaie de combiner le nom du fichier dans le dossier du journal qu'il agit bizarrement et supprime la partie "logs_rrd". – Rahul

Répondre

1

dans le cas où cela ne fonctionne pas, __file__ est probablement un chemin absolu, si

log_file = os.path.join(log_folder, file_name) 

n'a pas d'effet, (il file_name retour précis ou chiffré) et le répertoire du script original est conservé.

Au lieu de __file__[:-3], il suffit de faire:

os.path.basename(os.path.splitext(__file__)[0]) 

pour se débarrasser de l'extension (qui ne peut être .py dans certains cas BTW) et du chemin du fichier de script dans tous les cas, de sorte que le prochain os.path.join commande fonctionne correctement.

Autre solution à l'aide pathlib et un objet Path (nécessite Python 3):

pathlib.Path(__file__).with_suffix('').name 

qui supprime le répertoire & l'extension de fichier revient au même résultat.

+1

Je suis devenu partial à 'pathlib.Path', donc' p = pathlib.Path (__ fichier __) 'alors simplement' p.with_suffix (''). Name' * So * beaucoup plus lisible que 'os.path.blahblahblah (os.path.bloop (chemin) [0]) ' –

+0

J'ai toujours utilisé' os.path', mais ça va. –

+1

Même chose, ce n'est que récemment que j'ai commencé, mais il y a beaucoup de fonctionnalités merveilleuses. Au lieu de 'os.join', * surcharge l'opérateur '/' * (et le rend disponible comme méthode) !!! Il vaut la peine de vérifier: https://docs.python.org/3/library/pathlib.html –