Ordner wird nicht gefunden, ist aber da, wo liegt der Fehler?

Code-Stücke können hier veröffentlicht werden.
Antworten
rupix
User
Beiträge: 4
Registriert: Mittwoch 10. April 2019, 10:13

Mittwoch 10. April 2019, 10:33

Hallo in die Runde.

Ich hoffe ich bin hier richtig. Mein Kollege und ich haben ein kleines Projekt für unsere Firmenhomepage.

Wir haben ein bisschen Ahnung von Python, mein Kollege mehr als ich. Ich bin eher dafür da den Server (Ubuntu 18) einzurichten und das Skript dann automatisiert auf diesen laufen zu lassen.

Er hat den Code bei sich erstellt (Windows 10 mit Anaconda) und mir geschickt. Ich führe diesen aus, alle Plugins sind installiert via "PIP", alles gut soweit.

Wir haben aber denke ich ein Problem mit dem Pfad, ich bekomme es nicht hin. Ich habe den Code in "root" testweise mal ausgeführt, hier führt er das Skript auch aus, das ist natürlich nichts für das produktive Arbeiten.

Struktur: Ordner Workflows mit den Skripten skript1, skript2, skript3 usw. + dataHandler.py in diesem Ordner. Im selben Ordner wie Workflows (im Moment root/workflows, root/cm_rs) soll dann der Content landen.

Wir wollen unsere Website crawlen um neue Inhalte zu erkennen, bzw Änderungen.

Hier ist der Code:

Code: Alles auswählen

import website_crawler as wc
from random import randint
from time import sleep


file_path = "rs_cm"
memory_file_name = "df_memory.txt"
history_file_name = "df_crawler_history.txt"
url_filter = ["example.com"]
crawling_count = 5
crawling_period = 150


df_memory = wc.handle_memory_files(file_path+"/",memory_file_name)
df_history = wc.handle_memory_files(file_path+"/",history_file_name)

for i in range(crawling_count):
    rand_url = wc.pick_random_url(df_memory,url_filter)
    #sleep(randint(1,120))
    soup = wc.get_soup(rand_url)
    if soup == "Error":
        wc.overwrite_url_status(df_memory,rand_url,"Error")
    else:
        wc.overwrite_url_status(df_memory,rand_url,"crawled")
        df_hrefs = wc.get_hrefs(soup,rand_url)
        df_memory = wc.write_new_hrefs_to_memory(df_memory,df_hrefs)
        df_history = wc.write_new_hrefs_to_history(df_history,rand_url,df_hrefs)
        wc.set_recursion_limit()
        if wc.store_soup(file_path,rand_url,soup) != "Error":
            wc.store_soup(file_path,rand_url,soup)
        wc.set_recursion_limit("off")
            
#wc.update_crawling_status(df_memory,crawling_period)
wc.handle_memory_files(file_path+"/",memory_file_name,read=False,write_obj=df_memory)
wc.handle_memory_files(file_path+"/",history_file_name,read=False,write_obj=df_history)

Hier ist die Fehlermeldung:

FileNotFoundError: [Errno 2] No such file or directory: '/rs_cm/df_memory.txt'


Wenn ich aber direkt auf root die Datei ausführe, schreibt er mir eine aktuelle memory.txt und history file in den Ordner rs_cm, aber am Rest der Ordner ändert sich nichts.

Ich hab schon so viel versucht, evtl. ist es nur ein kleiner Fehler, darauf hoffe ich.

Vielen Dank im Voraus für eure Hilfe. Ich werde mir mal das Buch zur Gemüten führen müssen :)

Mfg

Ralf
__deets__
User
Beiträge: 5075
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. April 2019, 10:41

Das sind halt alles relative Pfade. Die werden dann eben relativ zum Arbeitsverzeichnis des Prozesses erstellt. Du musst also entweder file_path auf einen absoluten Pfad setzten, oder es per Argument an das Skript uebergeben (der Kollege arbeitet ja wohl unter Windows und hat andere Pfade), oder entsprechend sicherstellen, dass beim ausfuehren des Skriptes das Arbeitsverzeichnis stimmt. Also *IN* dem Verzeichnis starten.
rupix
User
Beiträge: 4
Registriert: Mittwoch 10. April 2019, 10:13

Mittwoch 10. April 2019, 12:43

Ok, vielen Dank für die Antwort.

Der Kollege legt die Pfade nicht an, das mache ich ja dann.

Was muss ich denn machen damit es eben keine relativen Pfade sind? Irgendwie lässt sich das Skript auch nur funktionierend im Ordner "root" ausführen, was ja nun im Sinne der Sicherheit keine Lösung sein kann.

Von mir aus gerne kann ich auch das skript im Ordner "linuxuser" starten, root war nur gewählt weil es einfach nicht funktioniert.

Was muss ich eintragen um eben "absoluten Pfad" nutzen zu können, sagen wir mal so:

Ausführen in user/linuxuser/workflows - Daten in user/linuxuser/rs_cm?

Vielen Dank.
__deets__
User
Beiträge: 5075
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. April 2019, 12:54

Hast du mal den Begriff eines absoluten Pfades gegoogelt? Das Konzept hat mit Python nichts zu tun, sondern mit Betriebssystemen und Filesystemen. Und gilt genau so für Ubuntu (oder jedes andere Linux) als auch fuer Windows.
Benutzeravatar
__blackjack__
User
Beiträge: 2764
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 10. April 2019, 12:56

@rupix: Jetzt haben wir schon zwei Probleme – Pfade und Ausführungsrechte, zu Code den wir nicht kennen. Nicht einmal den Traceback hast Du vollständig gezeigt, so dass man nicht einmal weiss wo genau das Problem im gezeigten Code auftritt.

Da sind auch ein paar Sachen die komisch aussehen. Zum Beispiel dieses ``+ '/'`` bei den Dateinamen sieht verdächtig danach aus als wenn der Code Pfade einfach als Zeichenketten verarbeitet, statt mit den entsprechenden Funktionen aus dem `os.path`-Modul oder `Path`-Objekten aus `pathlib`.
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
rupix
User
Beiträge: 4
Registriert: Mittwoch 10. April 2019, 10:13

Mittwoch 10. April 2019, 13:05

Das sind mehr als 2 Probleme, ich bin ja um was zu lernen :) Und ich hoffe das Ihr mir da helfen könnt, das wäre ja super.

Die Ordner haben alle Schreibrechte - mit chmod -R etc. und dem benutzer der darauf zugreifen soll. Das passt soweit alles.

Gerne nutze ich das os.path modul.

Und ja, ich habe gegoogled :) Aber alles kann man aus den vielen Lösungen auch nicht lernen.
__deets__
User
Beiträge: 5075
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 10. April 2019, 13:30

rupix
User
Beiträge: 4
Registriert: Mittwoch 10. April 2019, 10:13

Mittwoch 10. April 2019, 13:52

Oh man, ernsthaft, lag das nu echt am fehlenden / am Anfang? Das ist ja peinlich.

Am kleinen Testskript hats schon mal geklappt, nun schauen wir mal beim "großen".

Schon einmal vielen lieben Dank - ich komme wieder auf euch zurück.

Aber für mich, wie würde in meinem Fall oben die Lösung mit dem os.path modul aussehen?
Benutzeravatar
__blackjack__
User
Beiträge: 2764
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 11. April 2019, 11:01

In dem gezeigten Code müsste man die ``+ '/'`` entfernen und in dem oder den anderen Modulen dann schauen das mit Pfaden richtig umgegangen wird, eben mit den entsprechenden Funktionen aus `os.path`.
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Antworten