Ich bin neu in Stoff und habe Probleme, es zum Laufen zu bringen. Ich habe es zuerst über pip3 installiert, als ich versuchte, es auszuführen, bekam ich Befehl 'fab' nicht gefunden, ich fand es schließlich in /home/me/.local/bin/fab2.
Ist dies der richtige Ort?
Zweitens, wenn ich es so laufen lasse
/home/me/.local/bin/fab2 version
Ich bekomme
(2, 3, 1)
2.3.1
No idea what 'version' is!
import fabric
if hasattr(fabric, '__version__'):
# For fabric2
print(fabric.__version_info__)
print(fabric.__version__) # for a version tuple
else:
# for fabric1
from fabric.api import *
print(env.version)
Ist /home/me/.local/bin/fab2 der richtige Speicherort?
Was ist 'Keine Ahnung, was 'Version' ist!' warum wird es angezeigt?
Es sucht nach einer Aufgabenfunktion namens "Version" in einer Fabfile und findet keine. fab --version
macht dort was du willst.
In $HOME/.local/bin/
installiert pip ausführbare "Einstiegspunkte", wenn Sie pip install --user ...
- Sie könnten $HOME/.local/bin
zu Ihren PATH
hinzufügen (z. B. in Ihrem ~/.bash_profile
oder ~/.bashrc
). Wenn Sie sudo pip install Fabric
(ohne --user
) ausgeführt haben, würde dies den ausführbaren Einstiegspunkt in /usr/local/bin/
setzen, der sich wahrscheinlich bereits in Ihrem PATH
befindet. Oder Sie können stattdessen wahrscheinlich python -m fabric <fab args>
.
Hallo danke Stoff --Version hat super funktioniert
Ich habe das Skript so geändert, dass es so aussieht
def hello():
print("Hello world!")
Ich bekomme immer noch 'Keine Ahnung, was 'Hallo' ist!'
Gibt es ein Tutorial für Fabric 2. Ich habe eine verdammt gute Zeit, irgendetwas darin zum Laufen zu bringen. Ich habe das Tutorial für Fabric 1.14 gefunden, aber das ist im Moment nicht wirklich hilfreich, da keiner der Importe funktioniert. Ich gehe davon aus, dass Fabric 2 anders damit umgeht.
Wenn ich mit fab oder fab2 laufe, bekomme ich den gleichen Fehler
Ich habe Stoff in /home/me/fabric
@ajmcateer , ich hatte dieses Problem auch. Das Problem ist, dass die neue Fabric-Task-Methode (wie hier besprochen - http://docs.fabfile.org/en/1.14/usage/tasks.html) darin besteht, den @task- Dekorator zu verwenden. Das entsprechende „Hello World“-Beispiel lautet:
from fabric import task
<strong i="8">@task</strong>
def hello(ctx):
print("Hello World")
Das Ausführen von „fab hello“ liefert die erwartete Ausgabe.
Ich habe sowohl from fabric import task
als auch @task
decorator.
Ich bekomme immer noch den Fehler "Keine Ahnung ...".
Zusätzliche Details :
$ fab --version
Fabric 2.3.1
Paramiko 2.4.1
Invoke 1.1.1
$ python --version
Python 3.6.2
$ more tasks.py
#!/usr/bin/env python
from fabric import task
<strong i="10">@task</strong>
def build(c):
import pdb; pdb.set_trace()
print("Building!")
$ fab build -f tasks.py
No idea what 'build' is!
@mandravaze , ich kann bestätigen, dass es für mich funktioniert hat, obwohl ich eine Aufgabe in fabfile.py habe (ich denke, das ist das Problem in Ihrer env) und ich verwende die folgende Zeile, um anzurufen
$ fabelhaft gebaut
Ich denke, dies ist das Problem in Ihrer Umgebung
Wie kann ich Fehler beheben? Welche zusätzlichen Daten möchten Sie?
Welche Dateien haben Sie an diesem Ort? Ich denke, build() sollte in der fabfile.py sein, wenn es dort ist, nimmt Ihr Fab vielleicht eine falsche Datei auf ...
@mandarvaze in deinem Befehl fab build -f tasks.py
gibt es mehrere Verwirrungen.
fab -f tasks.py build
-f
ist für eine Konfigurationsdatei, nicht für eine Aufgabensammlung, das ist das Flag -c
, wie fab -c tasks build
(keine „.py“-Erweiterung!)inv
(aufrufen) die Datei mit den Aufgaben „tasks.py“ im aktuellen Verzeichnis ist, müssen Sie sie nicht angeben. Wenn die Datei mit den Aufgaben für fab
(Fabric) fabfile.py im aktuellen Verzeichnis ist, müssen Sie sie nicht angeben.@ploxiln fab -c tasks build
funktioniert. 👍
Danke.
@ajmcateer , ich hatte dieses Problem auch. Das Problem ist, dass die neue Fabric-Task-Methode (wie hier besprochen - http://docs.fabfile.org/en/1.14/usage/tasks.html) darin besteht, den @task- Dekorator zu verwenden. Das entsprechende „Hello World“-Beispiel lautet:
from fabric import task <strong i="9">@task</strong> def hello(ctx): print("Hello World")
Das Ausführen von „fab hello“ liefert die erwartete Ausgabe.
Entschuldigung für die dumme Frage, aber warum brauchen wir 'ctx' arg? Was ist es?
In Fabric 2 benötigen Sie dieses ctx
, um Befehle tatsächlich auf dem richtigen System auszuführen, z. B. ctx.run("hostname")
Wenn Ihr Problem darin besteht, dass Sie diesen Fehler für ein Aufgabenargument erhalten, kann es sein, dass Sie das Argument nicht im richtigen Format übergeben, sondern so, wie Sie Ihre Aufgabe benannt haben.
fab mytask --task-name value
nicht
fab mytask --task_name value
Mir ist klar, dass dies nicht zum Thema passt, aber da ich hier gelandet bin, überlasse ich dies jedem anderen, der dasselbe Problem hat.
In Fabric 2 benötigen Sie dieses
ctx
, um Befehle tatsächlich auf dem richtigen System auszuführen, z. B.ctx.run("hostname")
Erstmal danke für die Infos!!
Leider muss ich sagen, dass Fabric 2 völlig stumpf ist. Die Logik von 2.x ist sehr kontraintuitiv und es scheint wirklich nicht viele gute grundlegende Tutorials zu geben, wie man es benutzt. Beispiel: Vielleicht fehlt mir etwas, aber schauen Sie sich die Logik von 1.x und die Qualität dieses 1.x-Tutorials an: https://docs.fabfile.org/en/1.14/tutorial.html. Dann schau dich nach einem gleichwertigen Tutorial für 2.x um....
Kein Wunder, dass es eine inoffizielle Portierung von 1.x gibt und sie - ziemlich dreist - 3.x nennen
Nur eine allgemeine FYI, dass _keine_ dieser Details bezüglich der Notwendigkeit des @task
-Dekorators, der Übergabe eines Kontextobjekts usw. im Abschnitt "Übersicht und Tutorial" der öffentlichen Dokumentation für Fabric vorhanden sind: https://docs .fabfile.org/en/1.8/tutorial.html
Ich war ein intensiver Benutzer von Fabric 1 und ging naiv davon aus, dass diese exemplarische Vorgehensweise mir neue Semantik für Fabric 2 beibrachte, bevor ich dieses Problemticket fand. Es könnte die Einführung wirklich entmutigen, da die Dokumente für die Einarbeitung von Personen im Wesentlichen irreführend sind.
Ich bin mir nicht sicher, wie Sie auf dieser Seite gelandet sind, Sie sollten sich https://docs.fabfile.org/en/2.5/getting-started.html ansehen
Dank dafür! Vielleicht würde es zukünftigen Reisenden helfen, einen dicken "DEPRECATED"-Header auf die Dokumente der 1er-Serie zu werfen. Ich bin mir ziemlich sicher, dass ich entweder von einem Top-Google-Ergebnis oder den offiziellen Dokumenten der Fabric-Website dorthin navigiert bin, und in beiden Fällen denke ich, dass das Fabric-Team das Fabric-Team zwar nicht kontrollieren kann, aber ich vermute, dass viele potenzielle Adopter auftreten diese Frustration und könnten davon profitieren, wenn Sie auf die Notwendigkeit aufmerksam gemacht werden, die aktuellen Dokumente zu finden (die offiziellen von Python gehosteten Dokumente folgen einem ähnlichen Muster iirc).
Es könnte die Einführung wirklich entmutigen, da die Dokumente für die Einarbeitung von Personen im Wesentlichen irreführend sind.
Brandneuer Benutzer von Fabric. Ich habe "Fabric Python" gegoogelt und auf den Link "Übersicht und Tutorial" geklickt. Ja, ich fand das wirklich verwirrend und bin ziemlich überrascht, dass ich so früh im Prozess in die falsche Richtung gehen konnte.
Ich vermute, dass viele potenzielle Anwender diese Frustration erleiden und davon profitieren könnten, dass sie auf die Notwendigkeit aufmerksam gemacht werden, die aktuellen Dokumente zu finden (die offiziellen von Python gehosteten Dokumente folgen einem ähnlichen Muster iirc).
Ja.
Beachten Sie auch, dass dies die Ergebnisseite ist:
Diese eingerückten Links können konfiguriert werden, wenn Sie die Domain kontrollieren. Vielleicht ist es möglich, 1.x-Zeug aus den Suchergebnissen zu löschen, zusätzlich zum Hinzufügen eines "DEPRECATED"-Headers.
Ich bin gerade über diesen gestolpert und konnte ihn endlich reparieren. Dem Stoff fehlt nichts.
Folgendes habe ich getan.
╰─$ fab --version
Fabric 2.5.0
Paramiko 2.7.2
Invoke 1.4.1
In meinem fabfile.py
:
from fabric.tasks import task
<strong i="11">@task</strong>
def test(ctx, title):
print("ctx:", ctx)
print("title:", title)
Wenn ich nur die Aufgabe ausführe:
╰─$ fab test
'test' did not receive required positional arguments: 'title'
Das heißt, es erwartet title
als Argument.
Übergeben Sie also das Argument:
fab test title="hello world"
Ausgabe:
ctx: <your current context. Don't worry about it>
title: title=hello world
Beachten Sie jedoch, dass das übergebene Argument eine Zeichenfolge ist. Achten Sie darauf, mit =
aufzuteilen.
Beispielsweise:
<strong i="28">@task</strong>
def test(ctx, title):
print("ctx:", ctx)
print("title type:", type(title))
print("title:", title)
print("title value:", title.split("=")[1])
Lauf:
fab test title="hello world"
Ausgabe:
ctx: ...
title type: <class 'str'>
title: title=hello world
title value: hello world
Hilfreichster Kommentar
@ajmcateer , ich hatte dieses Problem auch. Das Problem ist, dass die neue Fabric-Task-Methode (wie hier besprochen - http://docs.fabfile.org/en/1.14/usage/tasks.html) darin besteht, den @task- Dekorator zu verwenden. Das entsprechende „Hello World“-Beispiel lautet:
Das Ausführen von „fab hello“ liefert die erwartete Ausgabe.