2017-03-10 6 views
1

ich eine große Menge an Studenten Python Projekte am Testen. Ich habe einen Doctest in einer separaten Datei erstellt, die ich beispielsweise mydoctest.rst aufgerufen habe.Mit bash for-Schleife Python doctest aus einer separaten Datei in Unterverzeichnissen läuft

Die erste Zeile des doctest Import Schüler Projekt des Moduls:

von project3 Import functionName-

Die doctest funktionieren gut, wenn ich es aus dem gleichen Verzeichnis wie Studentenprojekt nennen:

studentA$ python3 -m doctest mydoctest.rst 

Was möchte ich tun, ist ein bash-for-Schleife Befehl verwenden, um die oben für jedes Unterverzeichnis zu tun, also habe ich versucht, die folg tun geschuldet.

parentdirectory$ for d in *; do python3 -m doctest "$d/"mydoctest.rst; done 

Aber dann versucht, es für das Modul im aktuellen Verzeichnis zu suchen, anstatt in jedem Unterverzeichnis.

Gibt es eine Möglichkeit, um erste CD in jedes Unterverzeichnis vor do python3 -m doctest tun?

Meine aktuelle Problemumgehung (die ich nicht glücklich bin) ist: für d in *; Mach CD "$ d"; python3 -m doctest mydoctest.rst; CD ..; getan

Antwort

1

Dies sollte funktionieren

for d in *; do (cd "$d" ; python3 -m doctest mydoctest.rst); done 
+0

Was ist der Unterschied zwischen der Verwendung von ';' und '&&'? Sie scheinen das Gleiche zu tun. – egunawan

+0

&& startet den Befehl danach in einem neuen Thread (aber die gleiche Umgebung) und es gibt keine Garantie, dass der Befehl vor dem Start abgeschlossen sein wird. Obwohl für etwas klein wie "CD", wird dies wahrscheinlich rechtzeitig abgeschlossen sein. – user2381984

+0

Ich denke, Sie sprechen über '&'. ; ist ein Serialisierungsoperator, es wird zuerst den Befehl vor; dann der Befehl nach. & werde sie beide sofort machen, ohne auf einander zu warten. && ist ein boolescher Operator, er wertet zuerst den ersten Befehl aus, und wenn er falsch ist, weiß er, dass der ganze Ausdruck falsch ist, also wertet er den zweiten Befehl nicht aus. Wenn der erste Befehl wahr ist, wird der zweite Befehl ausgewertet, um zu sehen, ob das auch wahr ist. – 00prometheus

2

Ich schlage vor, eine Subshell (...) und cd zu verwenden:

for d in *; do (cd "$d" && python3 -m doctest mydoctest.rst); done 
+0

Wie nehme ich eine Antwort? – egunawan

+0

Ich nahm Ihre Antwort und machte es für meine Einstufungsprozess: 'for d in *; do (cd "$ d"; python3 -m doctest doctest3.rst; echo $ PWD); done' – egunawan

+1

@egunawan Klicken Sie einfach auf das Häkchen unter der Schaltfläche "Hoch/Runter". –

Verwandte Themen