it-swarm.com.de

"welche" äquivalente Funktion in Python

Ich muss die Umgebung einrichten, indem Sie den Befehl which abc ausführen. Gibt es eine Python-äquivalente Funktion für den Befehlwhich? Dies ist mein Code.

cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
52
prosseek

Es gibt distutils.spawn.find_executable() auf Python 2.4+

74
Rafael Reiter

Ich weiß, das ist eine ältere Frage, aber wenn Sie Python 3.3 oder höher verwenden, können Sie shutil.which(cmd) verwenden. Die Dokumentation finden Sie hier . Es hat den Vorteil, dass es sich in der Standardbibliothek befindet.

Ein Beispiel wäre so:

>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
39
iLoveTux

Dazu gibt es keinen Befehl, aber Sie können environ["PATH"] durchlaufen und prüfen, ob die Datei vorhanden ist, was which tatsächlich tut.

import os

def which(file):
    for path in os.environ["PATH"].split(os.pathsep):
        if os.path.exists(os.path.join(path, file)):
                return os.path.join(path, file)

    return None

Viel Glück!

13

( Ähnliche Frage )

Siehe Twisted-Implementierung: twisted.python.procutils.which

12
orip

Sie könnten etwas wie das Folgende versuchen:

import os
import os.path
def which(filename):
    """docstring for which"""
    locations = os.environ.get("PATH").split(os.pathsep)
    candidates = []
    for location in locations:
        candidate = os.path.join(location, filename)
        if os.path.isfile(candidate):
            candidates.append(candidate)
    return candidates

Wenn Sie Shell=True verwenden, wird Ihr Befehl durch die Systemshell ausgeführt, die die Binärdatei automatisch im Pfad findet:

p = subprocess.Popen("abc", stdout=subprocess.PIPE, Shell=True)
2
Greg Hewgill

Dies ist das Äquivalent des Befehls "which", der nicht nur prüft, ob die Datei vorhanden ist, sondern auch, ob sie ausführbar ist:

import os

def which(file_name):
    for path in os.environ["PATH"].split(os.pathsep):
        full_path = os.path.join(path, file_name)
        if os.path.exists(full_path) and os.access(full_path, os.X_OK):
            return full_path
    return None
2
o9000

Hier ist eine einzeilige Version früherer Antworten:

import os
which = lambda y: next(filter(lambda x: os.path.isfile(x) and os.access(x,os.X_OK),[x+os.path.sep+y for x in os.getenv("PATH").split(os.pathsep)]),None)

so benutzt:

>>> which("ls")
'/bin/ls'
0
Anonymous