Pfad und Verzeichnis

melanie1

Member
Hallo @ all,

Wie kann ich das Verzeichnis eines Programms abfragen?

Zur Information was genau ich suche:
Unter Linux gibt es einen symbolischen Link unter /proc/<pid>/exe, in dem diese Information steht; mit Freebsd lässt sich ebenenalls das procfs mounten, doch wie sieht die klassische Lösung dafür aus? ps,... funktionieren ja auch ohne das mounten.
Anwendung:
Ich würde gerne ein File, welches im selben Verzeichnis liegt wie ein Programm von diesem auslesen lassen.


Vielen Dank im Voraus :)

--
mfg
 
Meinst du aus dem Programm heraus (das wäre pwd) oder von einem anderen Programm?

Anwendung:
Ich würde gerne ein File, welches im selben Verzeichnis liegt wie ein Programm von diesem auslesen lassen.
So wie ich dich verstehe solltest du relative Pfade verwenden und brauchst überhaupt nicht zu wissen, wo dein Programm gerade läuft.
 
Hallo,

Dies ist leider nicht möglich, da das Programm ja aus einem beliebigen Verzeichnis aufgerufen werden kann, und damit der realtive Pfad von diesem Verzeichnis aus gelten würde.

--
mfg
 
oder whereis(1) programmname ?
oder pidof ?, wenn dich die pid des laufenden Programmes interessiert, wobei auch ein Blick in /var/run einiges zeigt.
Oder einfach die Ausgabe von ps nach grep und sed pipen und auslesen.
 
Hallo,

Dies ist leider nicht möglich, da das Programm ja aus einem beliebigen Verzeichnis aufgerufen werden kann, und damit der realtive Pfad von diesem Verzeichnis aus gelten würde.

--
mfg

aber du rufst dann doch das Programm in einem bestimmten Verzeichnis auf und willst im gleichen Verzeichnis ein File auslesen lassen, dann kennst du doch schon das Verzeichnis?
Gib das doch einfach dem Programm mit auf den Weg.
 
Wenn das Programm nicht in PATH ist, kannst du so den Pfad herausfinden: ${0%/*}

Dann kannst du mit "${0%/*}/filename" auf deine Datei zugreifen.
 
Zuletzt bearbeitet:
Hallo,

Erstmal vielen Dank für die vielen Antworten.

Vielleicht sollte ich einfach ein Minimalbeispiel geben:

Source - Haskell:
main = readFile "test.dat" >>= putStr

Nach dem Kompilieren soll dieses binary aufgerufen werden, u.u. auch über den Pfad, allerdings soll immer die im selben Verzeichnis wie das Programm liegende Datei test.dat ausgeben werden.

unter Linux würde das ganze wie folgt aussehen:
import System.Posix
main = do
pid <- getProcessID
sl <- readSymbolicLink ("/proc/"++show pid++"/exe")
[...]


--
mfg
 
Zuletzt bearbeitet:
Hallo,

Vielleicht etwas anders gefragt:

Wie ist es möglich, die Informationen die via procfs in /proc/curproc/ geladen werden direkt ab zu fragen?

--
mfg
 
Hallo,

da Du ja nicht gesagt hast, in welcher Programmiersprache, für Python einfach:
import sys
import os
print os.path.dirname(sys.argv[0])
 
Ich bin mal von einem Shell-Skript ausgegangen. /proc ist ein nutzloses Überbleibsel, dass für HAL wieder zum Leben erweckt wurde. Das ist eigentlich keine gute Quelle für irgend etwas.
 
Hallo,

Gibt es nun eine Möglichkeit das Verzeichnis zu ermitteln?
Ganz offensichtlich ja, denn Programme wie z.B. ps,... können dies. Doch wo lässt sich die Adresse von FreeBSD her ermitteln?

@Zoi: Deine Lösung funktioniert zwar, doch es geht nicht um Python ;) Es währe jedoch durchaus interessant wie python vorgeht...

--
mfg
 
@Zoi: Deine Lösung funktioniert zwar, doch es geht nicht um Python
Die kann aber afaik auch nur funktionieren, wenn man das Script/Programm zufällig über den abs path aufruft.

Ansonsten tut das was der Codeschnippsel macht , eigentlich überall. In argv[0] steht immer drin, wie man das Script/ Programm aufgerufen hat. Und dann noch je nach Programmiersprache den Dateiname vom Pfad abtrennen und fertig.
Wenn man das Programm aber halt nur über den reinen basenamen aufgeruft (oder über einen relativen Pfad), bekommt man bestimmt nicht das, was hier erwartet wird.
.
 
absoluter Pfad -> fertig
relativer Pfad (erstes Zeichen . anstatt /) -> pwd + pfad
kein Pfad -> pwd
 
relativer Pfad (erstes Zeichen . anstatt /) -> pwd + pfad
kein Pfad -> pwd
Dann arbeitet Python aber anders als andere Sprachen. Oder ist "pwd" nicht das, was allgemein als "Current Working Directory" bezeichnet ist (was ja i.d.R. nicht dieses ist, wo sich das Binary/Script befindet)?
 
ja pwd ist schon "Current Working Directory", aber "kein Pfad -> pwd" war natürlich auch falsch.
Man müsste sich die Info dann über 'which' besorgen.
 
Man müsste sich die Info dann über 'which' besorgen.
Also in Python gibt es wie ich so seh', ähnlich wie das __FILE__ in PHP, auch ein __file__. Das inspect - Module sieht da alternativ auch vielversprechend aus. Aber wie gesagt, Python ist nicht so mein Ding.

Man müsste sich die Info dann über 'which' besorgen.
Der OP könnte ja auch schreiben, welche Sprache er genau benutzt. i.d.R. gibt's eigentlich meist eine passende Methode/Funktion/Vorgehensweise, ohne externe Programme zu bemühen.
.
 
Hallo,

Ich verwende Haskell als Programmiersprache. Die verwendete Sprache sollte allerdings relativ egal sein, denn auch eine Lösung für C würde mir weiterhelfen :)

Liegt das Binary in einem im Pfad verzeichneten Directory, so ist es möglich diesen via findExecutable zu ermitteln. Ich habe hierfür das folgende Testprogramm geschrieben:
Code:
import System.Directory
import System.Environment
import System.Process

main = getProgName >>= findExecutable >>= print >>
 getCurrentDirectory >>= putStrLn >>
 getArgs >>= runCommand . unwords >>= waitForProcess

Rufe ich das Programm allerdings via
Code:
./pathTest/test1 pwd
auf, erhalte ich klarerweise die folgende Ausgabe:
Code:
Nothing
/usr/home/name/hs
/usr/home/name/hs
Nothing, da das Program nicht im Pfad gefunden werden konnte, /usr/home/name/hs von getCurrentDirectory und /usr/home/name/hs von pwd, da dies das aktuelle Verzeichnis ist, aus dem ich das Programm, welches allerdings in /usr/home/name/hs/pathTest/ liegt, aufgerufen habe.

Nach dem geschrieben wurde, dass es meinst die passende Funktion bereits gibt, hier der Link zu den Standartbibliotheken:
http://www.haskell.org/ghc/docs/latest/html/libraries/index.html

Falls obiges jemand testen möchte, so habe ich das Programm auch als Anhang hochgeladen :)

mfg
 

Anhänge

  • test1.zip
    176,1 KB · Aufrufe: 219
Zurück
Oben