openOdb mit aktuellem Verzeichnis verwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MarioW
User
Beiträge: 4
Registriert: Montag 1. Juli 2013, 10:49

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Zuletzt geändert von EyDu am Montag 1. Juli 2013, 11:15, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@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
MarioW
User
Beiträge: 4
Registriert: Montag 1. Juli 2013, 10:49

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!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du musst für base schon den passenden Pfad einsetzen. Das kann auch dirname(__file__) sein.
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@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.
MarioW
User
Beiträge: 4
Registriert: Montag 1. Juli 2013, 10:49

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 :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@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
MarioW
User
Beiträge: 4
Registriert: Montag 1. Juli 2013, 10:49

@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!
Antworten