Seite 1 von 1

openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 10:59
von MarioW
Hallo zusammen,

hier ist einer dieser fürchterlichen Neulinge, die gleich mal eine Frage stellen.

Ich nutze Abaqus (FEM) in Verbindung mit Python. Nach dem Abaqus ein Outputfile generiert hat, soll dieses in Python eingebunden werden um weitere Rechnungen damit anzustellen.
Das ganze funktioniert auch wunderbar, solange ich den Pfad zum Outputfile manuell eingebe. Nun würde ich aber gerne erreichen, dass der Pfad immer automatisch der Pfad ist, in dem auch das Python Skript ausgeführt wird. bisher habe ich folgendes versucht:

Code: Alles auswählen

import os
os.path.dirname(os.path.abspath(__file__))

myodb=openOdb(path= '%s\Output.odb') %os
Allerdings nutzt er dann einen Pfad, in dem das %s immernoch vorhanden ist.
Also statt:
C:\Ordner\Output.odb
nutzt er
C:\Ordner\%s\Output.odb

Wäre prima, wenn ihr mir weiterhelfen könntet.

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 11:13
von EyDu
Hallo und willkommen im Forum!

Du versuchst die Stringformatierung auf das Ergebnis von ``openOdb(path= '%s\Output.odb')`` anzuwenden, dass kann natürlich nicht klappen. Du müsstest daher das ``% os`` einfach in die Klammern hineinziehen. Allerdgins solltest du niemals Pfade mittels String-Formatting zusammensetzen, das führt unter Garantie irgendwann zu Fehlern. Nutze daher ``os.path.join``:

Code: Alles auswählen

myodb = openOdb(path=os.path.join([base, "Output.odb"])
Auch ein Backslash in Strings kann zu Fehlern führen, da diese Escape-Sequenzen einleiten. "\n" ergibt zum Beispiel einen Zeilenumbruch. Bei dir hast du ein "\O" eingebaut, was dir nur durch Glück nicht um die Ohren fliegt (da "\O" zufällig keine Escapesequenz ist).

Ach ja: Benutze doch bitte nächstes Mal ein lauffähiges minimales Beispiel, welches du auch getestet hast. Mit deinem gezeigten Code kann das von dir beschriebene Verhalten nämlich nicht auftreten, da das Programm vorher schon mit einer Exception ausssteigt.

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 11:14
von mcdwerner
@MarioW:
das %s sollte gleich nach dem String und nicht erst nach der Klammer stehen ;-)
am Besten verwendest Du zum Zusammensetzen des Pfades aber gleich os.path.join()!

edit: EyDu war schneller

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 12:01
von MarioW
Hallo ihr beiden,

erstmal vielen Dank für Eure schnelle Hilfe!!! Vor allem vielen Dank an EyDu für den Tipp, Pfade nie als Strings zu nutzen.

Leider ist das Problem noch nicht vollständig gelöst.

Mit folgendem Codeschnipsel:

Code: Alles auswählen

from odbAccess import * 
from abaqusConstants import *
import numpy
import os

myodb = openOdb(path=os.path.join([base, "Output.odb"])

mystep=myodb.steps['Step-2']
bricht das ganze mit invalid syntax ab, was denke ich an der fehlenden Klammer am Ende liegt. Füge ich diese ein, also:

Code: Alles auswählen

from odbAccess import * 
from abaqusConstants import *
import numpy
import os

myodb = openOdb(path=os.path.join([base, "Output.odb"]))

mystep=myodb.steps['Step-2']
so erhalte ich: NamerError: name 'base' is not defined.

@EyDu:
Ich starte das ganze über eine bat:
call c:\SIMULIA\Abaqus\Commands\abaqus python odb.py
pause

damit startet es und läuft bis zum oben genannten Punkt.

Danke schonmal im Vorraus!

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 12:08
von /me
Du musst für base schon den passenden Pfad einsetzen. Das kann auch dirname(__file__) sein.

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 12:09
von mcdwerner
@MarioW:
in Deinem Codeschnipsel wird base auch nirgends definiert.
Was sollte base denn sein?

os.path.join() erwartet als Argument übrigens keine Liste sondern die einzelnen Pfad-Teile als einzelne Argumente

Edit: die beiden *-Importe können sich gegenseitig in die Quere kommen, am Besten Du vergisst Sternchen-Importe gleich komplett wieder, die machen nur beim Arbeiten in der Konsole Sinn.

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 13:43
von MarioW
Vielen Dank für die schnellen Antworten.

habe das ganze nun über os.getcwd() gelöst.

Code: Alles auswählen

from odbAccess import  
from abaqusConstants import 
import numpy
import os

myodb = openOdb(path=os.path.join(os.getcwd(), "Output.odb"))
Vielen Dank an alle, die geholfen haben :)

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 13:48
von EyDu
Das hat aber nicht das von dir gewünschte Verhalten. Das Arbeitsverzeichnis kann, und tut tas häufig auch, vom Speicherort deines Moduls abweichen. Der Weg über __file__ war schon der richtige.

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 13:53
von mcdwerner
@MarioW:
So wie hier die Importe stehen, lösen sie einen Fehler aus.
Ich vermute Du hast nach dem Einfügen ins Forum-Posting einfach die * aus dem Code rausgelöscht (und verwendest sie dennoch im Modul weiter)?
Falls ja, nochmal die Warnung: wenn es in beiden Modulen z.B eine Funktion foo() gibt, welche ist dann in Dein Modul importiert worden?
verwende doch einfach:

Code: Alles auswählen

import odbAccess as oa 
import abaqusConstants as ac
was aber wiederum nicht der Lesbarkeit dient

Re: openOdb mit aktuellem Verzeichnis verwenden

Verfasst: Montag 1. Juli 2013, 14:29
von MarioW
@mcdwerner:
Jap, verwende nach wie vor die Sternchen. Vielen Dank für die Erklärung und den Hinweis, werde in Zukunft das ganze mit dem von dir vorgeschlagenen 'as' nutzen.

@EyDu:
Ok, Danke! Wusste nicht, dass das cwd abweichen kann. Hat zwar in meinem Fall funktioniert, aber habe es nun in:

Code: Alles auswählen

myodb = openOdb(path=os.path.join(os.path.dirname(__file__), "Output.odb"))
geändert. Funktioniert.

Vielen Dank!

Und nebenbei: Dickes Lob an das Forum! Freundlich, schnell und v.a. kompetent!