Puncte:0

Scripturile Python care actualizează lucrurile online au nevoie de un mediu virtual pentru a rula?

drapel ng

Am încercat de ceva vreme să programez un script python în cron să ruleze de două ori pe zi. Scriptul folosește câteva API-uri pentru a extrage informații de pe un site web și pentru a actualiza o foaie de calcul Google cu informațiile respective. Scriptul funcționează - îl pot rula manual fără probleme, dar când îl programez să ruleze dintr-un job cron, nu văd nicio ieșire.

După un pic de depanare am dat peste această pagină - https://cronitor.io/cron-reference/cron-troubleshooting-guide

Am parcurs toți pașii sugerați și am ajuns la partea de jos unde scrie:

„Pentru python, este posibil să descoperiți că aplicația dvs. web folosește un mediu virtual pe care trebuie să îl invocați în crontab.”

Cum „invoc un mediu virtual” în ubuntu? Sunt doar într-un moment în care nu știu cum să procedez. Dacă mă ajută, îmi rulez scriptul de pe un raspberry pi 3b pe Ubuntu 20.04.3 LTS și scriptul meu folosește API-ul Googlesheets.

EDIT: Lucruri pe care le-am făcut până acum pentru a depana:

  • Utilizatorul meu are permisiuni pentru a rula cron

  • Folosesc căi directe în jobul meu cron

  • Am verificat cron guru pentru a mă asigura că programul meu cron a fost setat corect și este.

  • Primesc rezultate dintr-o lucrare cron care tipărește data și ora într-un fișier (* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt) deci știu că funcționează.

  • Mi-am dat permisiunile executabile de script cu chmod +x Script.py

  • M-am asigurat că utilizatorul meu are permisiunea de a rula scriptul

  • M-am asigurat că există o linie goală la sfârșitul fișierului cron

  • Am creat un fișier shell executabil care execută scriptul

  • M-am asigurat că cron folosește același timp ca și ora sistemului

  • coada -f /var/log/syslog afișează ieșirea pentru scriptul meu la ora programată de ori, dar când verific dacă foaia mea de calcul a fost actualizată, nu este

  • Am adăugat shebang în partea de sus a scriptului meu python

user535733 avatar
drapel cn
Un mediu virtual *ar putea* să fie legat de un script Python care nu oferă rezultatul așteptat. Cu toate acestea, există multe motive comune care sunt mai probabile. Un script care se joacă doar cu Googlesheets nu are niciun motiv aparent să aibă nevoie de un mediu virtual. Bănuiesc că ești pe drumul greșit. Continuați cu depanarea cron și python de bază până când aveți răspunsuri mai precise.
Pocketmouse avatar
drapel ng
Aveți sugestii despre ce să încercați în continuare? Mi-am actualizat postarea cu lucruri pe care le-am încercat deja (lista era prea lungă pentru a o posta aici în comentarii). Sunt un pic dezavantajat aici când vine vorba de Ubuntu, deoarece nu sunt la fel de familiarizat cu el precum sunt python. Trebuie să caut pe Google totul și până acum tot ce am găsit nu mă ajută.
raj avatar
drapel cn
raj
Vă rugăm să rețineți că articolul pe care l-ați citat vorbește despre **aplicația web** Python. Aplicațiile web sunt aplicații care rulează pe un server web și, dacă sunt scrise în Python, ele folosesc adesea mediul virtual Python (venv). Nu este cazul tău. Dacă vă apelați scriptul dintr-o linie de comandă, probabil că nu folosește venv (cu siguranță v-ați aminti că ați creat venv-ul pentru el dacă ar fi cazul :)). Este mai degrabă o problemă cron „clasică” - valoarea lui `$PATH` sau a altor variabile este diferită în cron decât în ​​shell-ul interactiv și din această cauză scriptul dvs. poate să nu poată accesa unele module. Investigați-o.
user535733 avatar
drapel cn
Depanarea dvs. a demonstrat că nu este nimic în neregulă cu cron. 99% din timp, cron funcționează corect, iar tu ești în acel grup. Depanarea dvs. a demonstrat, de asemenea, că înțelegeți cum să utilizați și să depanați corect cron (bună treabă!). Prin urmare, este timpul să vă concentrați asupra scriptului dvs.: adăugați rezultatul de depanare la script-ul dvs. care va apărea într-un jurnal sau fișier local. Utilizați rezultatul de depanare pentru a restrânge ce parte a scriptului dvs. este problematică.
Puncte:0
drapel in

Mediile virtuale Python sunt arbori de directoare autonomi care conțin o instalare Python pentru o anumită versiune de Python, plus o serie de pachete suplimentare.

Să presupunem că scriptul folosește pachetul „cereri” pentru a face solicitări HTTP. Dacă ați instalat solicitări într-un mediu virtual, atunci va trebui să vă asigurați că mediul virtual este activ atunci când scriptul dumneavoastră rulează din cron. Altfel vei primi ImportError: Niciun modul denumit solicitări.

Pe de altă parte, dacă ați instalat solicitări la nivelul întregului sistem și nu utilizați medii virtuale, atunci nu trebuie să vă faceți griji pentru ele în contextul cron.


Iată ce aș face pentru a depana problema dvs. particulară: aș adăuga instrucțiuni de logare în script pentru a verifica ipotezele și ipotezele: scriptul începe deloc? Funcționează complet? Dacă face solicitări HTTP, ce stări HTTP primește înapoi?

Poate că scriptul aruncă o excepție, dar excepția nu este înregistrată nicăieri. Acest fragment captează doar stdout:

* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt 

Schimbați-l pentru a captura și stderr:

* * * * * /path/to/python3.8 /path/to/script/Script.py >> log.txt 2>&1

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.