Seite 1 von 2

ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 09:51
von Aramis
Hi,

ich habe ein Skript, welches im Ordner A ausgeführt wird. Das Skript lädt andere Dateien und einen OrdnerX in Ordner A. Wie genau dieser Ordner X heisst weiss ich vorher nicht. Jedoch muss der Rest vom Skript ab dem Moment, wo der OrdnerX geladen ist dort weitermacht. Wie kann ich jetzt eine Ebene tiefer wechseln? Dh. im Skript würde ich den neuen Pfad definieren und dann an die Funktion übergeben.

nur wie definiere ich diesen Pfad?
Ich hab schon mit new_path=os.path.abspath("./.") probiert, aber da gehts nur nach oben und nicht nach unten die der Verzeichnisstruktur.

vielen Dank.
Aramis

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 10:20
von Sirius3
Es heißt auch `..`. So ganz werde ich aus Deiner Beschreibung nicht schlau.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 10:28
von Aramis
ich hab so eine Funktion gerad geschrieben um das Verzeichnis zu wechseln. Aber irgendwo ist da noch ein Haken. Es funktioniert nicht.

Code: Alles auswählen

def change_dir(path='.'):

    for filename in os.listdir(path):
        if os.path.isdir(os.path.join(path, filename)) is True:
            new_path=os.path.join(path,filename)
            #list_files(os.path.join(path, filename))
    print(new_path)
    os.chdir(new_path)



es würde auf der Kommandozeile dem Befehl cd entsprechen. Nur dass ich zu dem Zeitpunkt nicht den genauen Ordnernamen kenne. Ich weiss nur, dass es ein Unterordner im Verzeichnis ist, wo ich mich gerade befinde.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 10:31
von __blackjack__
@Aramis: An den Ordner in dem das Modul liegt, kommst Du mit ``os.path.dirname(__file__)``. Und wechseln im Sinne von den aktuellen Arbeitspfad des Prozesses ändern sollte man nicht machen. Vergiss `os.chdir()` am besten gleich wieder. Das ist globaler Zustand.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 10:35
von Sirius3
Ein `is True` ist meist überflüssig. chdir solltest Du nicht benutzen. Das ändert einen globalen Zustand, was dazu führen kann, dass an anderer Stelle erwartet wird, dass relativ zu einem Verzeichnis irgendeine Datei zu finden ist, was dann nicht mehr funktioniert.

Was ist Dein eigentliches Problem? Nicht beschreiben, wie Du denkst, dass das Problem zu lösen ist.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 10:44
von Aramis
@Sirus3: ok, ich probiers mal aufzuschreiben.
in einen leeren Ordner werden die Daten aus einem anderen (externen) Verzeichnis kopiert. in diesen kopierten Daten befinden sich bestimmte KeyWörter die ich über eine Suche auslese.
Nun muss mein Skript ja in die kopierten Unterordner rein und dort suchen. Und das ist mein Problem. das die Suchfunktion (die funktioniert) einfach die Unterebenen durchläuft. rekursiv abwärts.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 10:58
von Sirius3
Also möchtest Du von einer Wurzel aus alle Unterordner durchsuchen, das geht mit os.walk, bzw. moderner mit pathlib.Path.glob:

Code: Alles auswählen

for filename in pathlib.Path(basepath).glob('**/*'):
    print(filename)

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 11:15
von Aramis
bekomme eine Fehlermeldung:

Code: Alles auswählen

from pathlib import Path
NameError: name 'pathlib' is not defined

(das Package ist installiert....hab ich nachgeschaut)

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 11:23
von __blackjack__
@Aramis: Wenn es installiert ist, dann kann man es auch importieren. Wie hast Du denn nachgeschaut? Sicher das Du beim richtigen Pythoninterpreter nachgeschaut hast wenn Du mehrere auf dem System installiert hast?

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 11:42
von Aramis
ja, des passt....
es ist wie verhext. :(

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 11:49
von narpfel
Ich würde eher folgendes vermuten:

Code: Alles auswählen

>>> from pathlib import Path
>>> pathlib.Path().glob("**/*")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'pathlib' is not defined
>>> Path().glob("**/*")
<generator object Path.glob at 0x7fb5db34af68>
`import` ist im Kapitel „Modules“ des offiziellen Tutorials beschrieben.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:04
von Aramis

Code: Alles auswählen

 for filename in pathlib.Path(basepath).glob('**/*'):
NameError: name 'pathlib' is not defined
das ist der einzige Fehlercode: davor noch die Zeile in der Datei wo der code steht. mehr nicht.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:06
von Sirius3
Steht da nun ein `import pathlib` oder nicht?

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:12
von Aramis
ja klar, hab ich oben bei den Imports importiert.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:17
von narpfel
@Aramis: Das kann nicht sein. Wenn `import pathlib` keinen Fehler auslöst, ist danach der Name `pathlib` vorhanden. Bitte zeige den kompletten Code (am besten als Minimalbeispiel), sonst können wir nur raten oder Vermutungen anstellen.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:18
von Sirius3
Wenn es dann nicht funktioniert, zeige bitte den kompletten Code inklusive Fehlermeldung und komplettem Traceback, damit wir das Problem nachvollziehen können.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:34
von Aramis
wenn ich die Suchfunktion in dem Unterordner laufen lasse, findet sie mir genau das was ich suche. nur liegt das Skript halt ein Verzeichnis drüber.
das jeweilige Keyword endet mit einem Leerzeichen, deshalb nochmal die if Abfrage nach dem index_blank.

Code: Alles auswählen

def search_keyword():
    for filename in pathlib.Path(basepath).glob('**/*'):
        out_shell = Popen([shellcmd], stdout=PIPE)
        out_data = output_cmd.communicate()[0]
    
        search_index = str(out_data).find(keyword)  
    
        if search_index is not -1:
            index_blank = str(out_data).find('\n', search_index)
            if search_index_blank is -1:  
                print(str(out_data)[search_index:]) 
            else:
                print(str(out_data)[search_index:index_blank])  

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 12:58
von __blackjack__
An dem Quelltext sieht man jetzt aber nicht wo Du `pathlib` importierst, also nur diese Funktion wird zu einem `NameError` führen. Ausserdem kommen `output_cmd`, `keyword`, und `search_index_blank` einfach magisch aus dem nichts. Das sollte nicht sein. Alles, ausser Konstanten, was eine Funktion oder Methode an Werten braucht, sollte die Funktion/Methode als Argument(e) betreten. Wobei ich gerade sehe das `output_cmd` wahrscheinlich `out_shell` heissen sollte, das also ziemlich sicher nicht der Quelltext ist, den Du tatsächlich mal hast laufen lassen. Es macht nicht so viel Sinn Fehler in einem ähnlichen Quelltext statt dem tatsächlichen zu suchen. Kann es sein das es bei `search_index_blank` ähnlich ist? `blank` ist übrigens ein Leerzeichen und kein Zeilenende.

`filename` wird überhaupt nicht verwendet, was soll das da also?

``is`` und ``is not`` sind hier falsch verwendet. Es ist Zufalls dass das funktioniert. Wenn Du auf Gleichheit/Ungleicheit testen möchtest, dann verwende ``==`` und ``!=``. ``is`` und ``is not`` beziehen sich nicht auf den Wert, sondern auf die Objektidentität.

Ich persönlich verwende `find()` gar nicht, sondern lieber `index()`. Das löst eine Ausnahme aus wenn nichts gefunden wird. Ist mir sicherer als ein Zahlenwert der zufällig auch ein gültiger Index wäre wenn man nicht aufpasst.

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 13:10
von Aramis
@__blackjack__ Sorry, ich hab versucht die Namen zu editieren, dass es leichter lesbar ist. ist wohl nach hinten losgegangen. ...

Re: ins Unterverzeichnis (nur eine Ebene) wechseln

Verfasst: Montag 9. Juli 2018, 13:38
von Aramis
das wäre der Code:
die pathlib for Schleife hab ich wieder rausgenommen. aber der Import steht oben.

Code: Alles auswählen

import os
import sys
import subprocess
from subprocess import Popen, PIPE
from subprocess import call
from pathlib import Path

keyword = 'irgendwas'

def import_dir():
    subprocess.call(['git', 'clone', 'http://xyz/.git'])


# an dieser Stelle muss die search funktion im Unterverzeichnis anfangen zu arbeiten
# also wechsel eine Ebene tiefer und dann weiter ...

def search():
    shell_cmd = Popen(["git", "log", "--all"], stdout=PIPE)
    data = shell_cmd.communicate()[0]

    search_index = str(data).find(keyword)

    if search_index != -1:
        index_blank = str(data).find('\n', search_index)
        print(str(data)[search_index:index_blank])



import_dir()
search()