python und bash clipboard

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
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

hallo,

ich will die aktuellen sachen aus dem Clipboard in einer variable speichern, dann einen Text einfügen und dann die alten sachen wieder in das Clipboard schreiben.

Bisher habe Ich es so probiert (Python 3):

Code: Alles auswählen

#!/usr/bin/python3
import os
import sys
import subprocess

#write old clipboard to variable
altes_clipboard = subprocess.check_output(['xclip', '-o'])

text = "dieser text wird eingefügt"

kommando = "echo '" + text + "'|xclip -selection clipboard"
os.system(kommando)

keyboard.send_keys("<ctrl>+v")

#write old clipboard back
altes_clipboard2 = "echo '" + altes_clipboard + "'|xclip -selection clipboard"
os.system(altes_clipboard2)
Allerdings is nacher nicht, das was vorher im Clipboard war, wieder drin, sondern der "text"...

Was mache Ich falsch?

Wenn Ich nachdem Ich das Script ausgeführt habe, dann einmal gucke was jetzt im Clipboard drin ist, kommt dies hier:

>>> subprocess.check_output(['xclip', '-o'])
b'%MCEPASTEBIN%'
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Also ich versuche es jetzt mit Pyperclip.

Aber wenn Ich in Autokey-gtk Pyperclip.copy('blub') nutzen will kommt:

Script name: 'Selection Test2'
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/autokey/service.py", line 460, in execute
exec(script.code, scope)
File "<string>", line 2, in <module>
File "/usr/local/lib/python3.5/dist-packages/pyperclip/__init__.py", line 138, in copy_gtk
cb = gtk.Clipboard()
File "/usr/lib/python3/dist-packages/gi/__init__.py", line 64, in __getattr__
raise AttributeError(_static_binding_error)
AttributeError: When using gi.repository you must not import static modules like "gobject". Please change all occurrences of "import gobject" to "from gi.repository import GObject". See: https://bugzilla.gnome.org/show_bug.cgi?id=709183


Ich hab jetzt ein paar Github Seiten gefunden, wo das Problem beschrieben wird und da steht was von wegen man soll GTK3 statt GTK (?) nutzen.
Wie oder wo kann ich das umstellen?
Hab keinen Fix gefunden.

Wenn Ich das Ganze direkt in einer Python-konsole eingebe, gehts.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich hab jetzt ein paar Github Seiten gefunden, wo das Problem beschrieben wird und da steht was von wegen man soll GTK3 statt GTK (?) nutzen.
Wie oder wo kann ich das umstellen?
Gar nicht. Das ist das, was deine Linux-Distribution mitbringt, du kannst nicht manuell zwischen GTK3 und GTK2 wechseln.

GTK3 ist aber seit Jahren Standard... Welche Linux-Distribution benutzt du?

Gruß, noisefloor
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Was ich da gefunden hatte war recht aktuell, von Dezember 2017.
Allerdings haben die da auf einen Bug verlinkt, der schon 2013 war, was mich dann wieder etwas verwundert hat.
Fidne den Eintrag aber gerade nicht wieder.

Ich benutze Linux Mint 18.1 Cinnamon 64bit.


Ich habs gerade auch einmal in einer virtuellen Maschine mit Cinnamon 18.3. getestet, da tritt die selbe Fehlermeldung auf.
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Hab den Bug jetzt gefunden:
https://bugzilla.gnome.org/show_bug.cgi?id=709183

Da ist auch ein Fix: https://bug709183.bugzilla-attachments. ... ?id=282629

Aber Ich weiss nicht wie Ich den einspiele, kann mir jemand sagen wie das geht?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@brainstir: Es sieht so aus, als würde Autokey Gtk3 benutzen, Pyperclip aber Gtk2. Das geht nicht.

Es gibt hier einen PR, der Pyperclip auf Gtk3 portiert. Damit müsstest du den eigentlich anwenden und das Resultat installieren können:

Code: Alles auswählen

git clone https://github.com/asweigart/pyperclip.git
cd pyperclip
git remote add pr https://github.com/coreycb/pyperclip.git
git pull pr master
pip install --user .
Das sollte dann die systemweite Installation überschreiben.
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Ok danke, habe den Pyperclip-Port installiert, aber Ich bekomme immer noch die selbe Fehlermeldung in Autokey.

Muss Ich da noch irgendwas machen bevor er die neu installierte Pyperclip Version benutzt?
Oder muss ich das neu installierte Pyperclip in einen bestimmten Ordner verschieben?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@brainstir: Was war denn die Ausgabe von `pip`? Und was wird ausgegeben, wenn du das hier ausführst:

Code: Alles auswählen

import sys
print(sys.path)

import pyperclip
print(pyperclip)
Verschieben solltest du eigentlich nichts müssen, das Installieren übernimmt der `pip`-Aufruf.
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

Bei pip stand es wurde successfull installiert.

Die Ausgabe der Befehle lautet:

Code: Alles auswählen

-> % python3 
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/local/lib/python3.5/dist-packages/setuptools-28.8.0-py3.5.egg', '/usr/lib/python3/dist-packages']
>>> import pyperclip
>>> print(pyperclip)
<module 'pyperclip' from '/usr/local/lib/python3.5/dist-packages/pyperclip/__init__.py'>
Wenn Ich das jetzt richtig verstehe nimmt er noch das falsche Paket von der Distribution, weil das GTK3-Pyperclip hatte Ich hier installiert:

Code: Alles auswählen

benutzer@pc [15:53:05] [~/Documents/pyperclip-gtk3/pyperclip/pyperclip] [master]
-> % ll
insgesamt 24K
-rw-r--r-- 1 benutzer benutzer 21K Feb 21 13:13 __init__.py
Oder kopiert der das normalerweise direkt in den Ordner?
Ich kenne mich mit pip nicht aus.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Hast du `pip` oder `pip3` ausgeführt? `pip` installiert Pakete für Python 2. Besser ist es, `pip` als Modul mit dem richtigen Interpreter auszuführen:
[codebox=bash file=Unbenannt.bsh]
python3 -m pip install --user .
[/code]

Und falls du das irrtümlich für Python 2 installierte `pyperclip` nicht brauchst, kannst du es mit
[codebox=bash file=Unbenannt.bsh]
python2 -m pip uninstall pyperclip
[/code]
wieder entfernen.

Pip installiert Pakete im Grunde genommen, indem es das Paket (bzw. Modul, wenn es nur eine einzelne Datei ist) an den richtigen Ort kopiert und dann noch Metadaten anlegt (etwa eine Liste mit den Dateien, die zu einem Paket gehören und beim Deinstallieren wieder entfernt werden müssen).
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

okay, ich habe es jetzt mit python3 installiert und die python2-version deinstalliert.

Jetzt kommt zwar keine Fehlermeldung mehr, aber dafür friert Autokey jetzt entweder komplett ein oder es wird nach dem Versuch das Skript auszuführen direkt geschlossen :(
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

hat jemand vielleicht zu dem ursprünglichen code eine idee?
Antworten