hallo,
ich habe eine clipb.py in dem script-ordner von autokey, der automatisch importiert wird.
Dort habe Ich eine __init__.py angelegt.
In meinem Script kann Ich auf die selbst definietrten funktionen so zugreifen:
from clipb import getClipboardData,setClipboardData
Ich würde aber gerne einfach Alles was in der clipb.py definiert ist importieren, wie mache Ich das?
Ich habe es schon mit
import clipb
oder
from clipb import *
probiert, aber dann kann er die Funktionen nicht aufrufen.
ganze .py importieren
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
Wie rufst du die Funktion auf und welche Fehler bekommst du? Oder bekommst du schon beim import-Statement eine Fehlermeldung?aber dann kann er die Funktionen nicht aufrufen.
Gruß, noisefloor
Es kommt die Fehlermeldung, dass getClipboardData nicht definiert ist.
Der Code in der aufrufenden Datei sieht so aus, also so funktioniert es:
und die clipb.py sieht so aus:
Der Code in der aufrufenden Datei sieht so aus, also so funktioniert es:
Code: Alles auswählen
#!/usr/bin/python3
from clipb import getClipboardData,setClipboardData
cp_altes_clipboard = getClipboardData()
fragen = r'''text'''
setClipboardData(fragen.encode('utf-8'))
keyboard.send_keys("<ctrl>+v")
setClipboardData(cp_altes_clipboard)
Code: Alles auswählen
#!/usr/bin/python3
import subprocess
def getClipboardData():
p = subprocess.Popen(['xclip','-selection', 'clipboard', '-o'], stdout=subprocess.PIPE)
retcode = p.wait()
data = p.stdout.read()
return data
def setClipboardData(data):
p = subprocess.Popen(['xclip','-selection','clipboard'], stdin=subprocess.PIPE)
p.stdin.write(data)
p.stdin.close()
retcode = p.wait()
Ohne es zu testen und nur nach Bauchgefühl: Schreibst Du den Modulnamen vor die importierten Funktionen bei deren Verwendung?
Du meinst clipb.getClipboardData ?pixewakb hat geschrieben:Ohne es zu testen und nur nach Bauchgefühl: Schreibst Du den Modulnamen vor die importierten Funktionen bei deren Verwendung?
Das habe Ich schon probiert, geht auch nicht.
Poste mal deinen Traceback, also wie Python den Fehler beschreibt (entferne ggf. persönliche Inhalte, Namen in Pfadangaben usw.). Auch wichtigen Quellcode kannst du herausnehmen, es geht darum, dass man einen Eindruck bekommt, wie der Fehler ausschaut, z. B.:
Code: Alles auswählen
>>> import fehlendes_modul
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
import fehlendes_modul
ModuleNotFoundError: No module named 'fehlendes_modul'
>>>
Nochmals von vorne:
Wo und in welchen Ordner ist dein zu importierendes Modul gespeichert? Was liegt sonst noch in dem Ordner?
Wo und in welchen Ordner ist dein auszuführendes Skript gespeichert? Was liegt sonst noch in dem Ordner?
Poste mal den kompletten Traceback im Orginal.
Wo und in welchen Ordner ist dein zu importierendes Modul gespeichert? Was liegt sonst noch in dem Ordner?
Wo und in welchen Ordner ist dein auszuführendes Skript gespeichert? Was liegt sonst noch in dem Ordner?
Poste mal den kompletten Traceback im Orginal.
Also die Fehlermeldung in Autokey sieht so aus:
Der Name des Ordners in dem die Dateien liegen und der auch in der ScriptEngine von Autokey eingestellt ist lautet:
/home/Mein_Name/python/import
Hier drin liegen ein Ordner __pycache__ , der anscheinend automatisch erstellt wurde, eine Datei clipb.py und eine __init__.py, die leer ist.
Die ausführende Datei liegt in /home/Mein_Name/.config/autokey/data/MyPhrases
Dort liegen noch ein paar andere .py und .json Dateien von autokey.
Code: Alles auswählen
Script name: 'importtest2'
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 6, in <module>
NameError: name 'getClipboardData' is not defined
/home/Mein_Name/python/import
Hier drin liegen ein Ordner __pycache__ , der anscheinend automatisch erstellt wurde, eine Datei clipb.py und eine __init__.py, die leer ist.
Die ausführende Datei liegt in /home/Mein_Name/.config/autokey/data/MyPhrases
Dort liegen noch ein paar andere .py und .json Dateien von autokey.
Die __init__.py-Datei zeigt nur den Modul-Ordner an, d. h. Python weiß jetzt, dass da eigentlich Programmdateien liegen. Merkwürdig.
Ich hatte ähnliche Probleme mit einer selbst geschriebenen Bibliothek. Du könntest mal versuchen das Modul neu zu installieren.
https://packaging.python.org/tutorials/ ... g-packages
BTW: Wenn es klappt, wenn du die Funktionen explizit importierst, dann würde ich das auch gerne erst einmal nutzen, weil das auch die optimale Möglichkeit ist, die Funktionen zu verwenden (Stichwort Namensraum).
Ich hatte ähnliche Probleme mit einer selbst geschriebenen Bibliothek. Du könntest mal versuchen das Modul neu zu installieren.
https://packaging.python.org/tutorials/ ... g-packages
BTW: Wenn es klappt, wenn du die Funktionen explizit importierst, dann würde ich das auch gerne erst einmal nutzen, weil das auch die optimale Möglichkeit ist, die Funktionen zu verwenden (Stichwort Namensraum).
Ja, ich kann es so machen, dass Ich die Funktionen einzeln importiere.
Das eigentliche Problem was Ich habe ist, wenn Ich in der clipb.py eine weitere Funktion hinzufügen möchte, dass Ich dann in jeder meiner aufrufenden Python-Datei die import Zeile ändern muss.
Kann Ich das irgendwie anders umgehen, indem Ich einfach eine Funktion in der clipb.py definiere, die automatisch alle Funktionen aus der Datei importiert und Ich dann in jedem meiner Skripte nur diese eine Funktion importieren muss oder so ähnlich? Wie ginge das?
Welches Projekt soll Ich mit pip neu installieren? Autokey?
Die clipb.py habe Ich ja selbst geschrieben und nicht per pip installiert..
Das eigentliche Problem was Ich habe ist, wenn Ich in der clipb.py eine weitere Funktion hinzufügen möchte, dass Ich dann in jeder meiner aufrufenden Python-Datei die import Zeile ändern muss.
Kann Ich das irgendwie anders umgehen, indem Ich einfach eine Funktion in der clipb.py definiere, die automatisch alle Funktionen aus der Datei importiert und Ich dann in jedem meiner Skripte nur diese eine Funktion importieren muss oder so ähnlich? Wie ginge das?
Welches Projekt soll Ich mit pip neu installieren? Autokey?
Die clipb.py habe Ich ja selbst geschrieben und nicht per pip installiert..
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
eine Datei, die in /usr/lib/python3/dist-packages/autokey/service.py sieht eine Datei, die in /home/Mein_Name/python/import liegt, eigentlich nicht.
Mir ist deine Struktur auch nicht klar... Wieseo hast du eine Datei in dist-packages liegen bzw. wieso hat du eine Datei dort modifiziert?
Gruß, noisefloor
eine Datei, die in /usr/lib/python3/dist-packages/autokey/service.py sieht eine Datei, die in /home/Mein_Name/python/import liegt, eigentlich nicht.
Mir ist deine Struktur auch nicht klar... Wieseo hast du eine Datei in dist-packages liegen bzw. wieso hat du eine Datei dort modifiziert?
Gruß, noisefloor
Man kann das mit *-importen. Die sind aber verpoent, weil man nicht mehr weiss, welche Namen einem da in das Modul gegoebelt werden. Und ich verstehe dein Problem auch nicht: wenn du eine neue Funktion benutzen willst, musst du doch eh Code schreiben, der das tut. Sonst brauchst du sie ja auch nicht importieren. Und das ist dann so viel Arbeit?brainstir hat geschrieben:J
Das eigentliche Problem was Ich habe ist, wenn Ich in der clipb.py eine weitere Funktion hinzufügen möchte, dass Ich dann in jeder meiner aufrufenden Python-Datei die import Zeile ändern muss.
@noisefloor: dieses autokey benutzt scheinbar irgendeinen seltsamen Import-Mechanismus. Erkennt man daran, dass die Fehlerzeile ein `exec` enthält.
@brainstir: wie sieht denn nun Dein "importtest2" aus? Dort tritt in Zeile 6 ein Fehler auf, was Du aber zeigst hat in Zeile 6 eine Leerzeile. Ohne zu wissen, was Du eigentlich machst, kann man Dir nicht helfen.
@brainstir: wie sieht denn nun Dein "importtest2" aus? Dort tritt in Zeile 6 ein Fehler auf, was Du aber zeigst hat in Zeile 6 eine Leerzeile. Ohne zu wissen, was Du eigentlich machst, kann man Dir nicht helfen.
@noisefloor:
den import-Ordner habe Ich in Autokey als den Script-Ordner hinzugefügt, daher sollte das Skript alle Dateien darin sehen und tut es ja offensichtlich aus, sonst würde es ja nicht gehen, wenn Ich jede Funktion einzeln von dem Skript aus aufrufe.
Die Date in dist-packages ist von autokey und die habe Ich nicht modifiziert.
@__deets__:
Das stimmt, dass Ich den Code eh anpassen muss, aber ich würde gerne einfach eine datei importieren und alle funktionen, die da drin sind stehen mir zur verfügung, ohne dass ich jede Funktion einzeln importieren möchte. So wie wenn ich eine vorgefertigte bibliothek von python importiere, da sage ich ja auch einfach import DATEINAME und muss nicht die funktionen angeben.
Dann muss ich nur den eigentlichen code ändern und kann immer sagen importiere alle aus der clipb.py und ich rufe halt die einzelnen funktionen, die ich brauche dann auf.
Mit * importieren funktioniert allerdings auch nicht.
@Sirius3:
Die sechste Zeile ist diese hier:
cp_altes_clipboard = getClipboardData()
Ich hatte noch einen Kommentar drin, den Ich nicht mitkopiert habe, deshalb sah das hier in meinem kopierten Text wie eine Leerzeile aus.
Sieht jetzt so aus (also so, dass es funktioniert, wenn Ich die einzelnen Funktionen importiere, was ich ja eigentlich vermeiden will:
den import-Ordner habe Ich in Autokey als den Script-Ordner hinzugefügt, daher sollte das Skript alle Dateien darin sehen und tut es ja offensichtlich aus, sonst würde es ja nicht gehen, wenn Ich jede Funktion einzeln von dem Skript aus aufrufe.
Die Date in dist-packages ist von autokey und die habe Ich nicht modifiziert.
@__deets__:
Das stimmt, dass Ich den Code eh anpassen muss, aber ich würde gerne einfach eine datei importieren und alle funktionen, die da drin sind stehen mir zur verfügung, ohne dass ich jede Funktion einzeln importieren möchte. So wie wenn ich eine vorgefertigte bibliothek von python importiere, da sage ich ja auch einfach import DATEINAME und muss nicht die funktionen angeben.
Dann muss ich nur den eigentlichen code ändern und kann immer sagen importiere alle aus der clipb.py und ich rufe halt die einzelnen funktionen, die ich brauche dann auf.
Mit * importieren funktioniert allerdings auch nicht.
@Sirius3:
Die sechste Zeile ist diese hier:
cp_altes_clipboard = getClipboardData()
Ich hatte noch einen Kommentar drin, den Ich nicht mitkopiert habe, deshalb sah das hier in meinem kopierten Text wie eine Leerzeile aus.
Sieht jetzt so aus (also so, dass es funktioniert, wenn Ich die einzelnen Funktionen importiere, was ich ja eigentlich vermeiden will:
Code: Alles auswählen
#!/usr/bin/python3
from clipb import getClipboardData,setClipboardData
cp_altes_clipboard = getClipboardData()
fragen = r'''text'''
setClipboardData(fragen.encode('utf-8'))
keyboard.send_keys("<ctrl>+v")
setClipboardData(cp_altes_clipboard)
Hast du mal überlegt eine setup.py zu schreiben und es dann systemweit zu installieren? Das könnte - die anderen korrigieren mich bitte - eine Möglichkeit sein, das Problem zu lösen. Du müsstest dann nur von Zeit zu Zeit upgraden, wenn du größere Änderungen vorgenommen hast.