Seite 1 von 1
ganze .py importieren
Verfasst: Mittwoch 28. Februar 2018, 17:24
von brainstir
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.
Re: ganze .py importieren
Verfasst: Mittwoch 28. Februar 2018, 20:36
von noisefloor
Hallo,
aber dann kann er die Funktionen nicht aufrufen.
Wie rufst du die Funktion auf und welche Fehler bekommst du? Oder bekommst du schon beim import-Statement eine Fehlermeldung?
Gruß, noisefloor
Re: ganze .py importieren
Verfasst: Mittwoch 28. Februar 2018, 21:11
von brainstir
Es kommt die Fehlermeldung, dass getClipboardData nicht definiert ist.
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)
und die clipb.py sieht so aus:
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()
Re: ganze .py importieren
Verfasst: Mittwoch 28. Februar 2018, 22:47
von pixewakb
Ohne es zu testen und nur nach Bauchgefühl: Schreibst Du den Modulnamen vor die importierten Funktionen bei deren Verwendung?
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 09:04
von brainstir
pixewakb hat geschrieben:Ohne es zu testen und nur nach Bauchgefühl: Schreibst Du den Modulnamen vor die importierten Funktionen bei deren Verwendung?
Du meinst clipb.getClipboardData ?
Das habe Ich schon probiert, geht auch nicht.
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 09:10
von pixewakb
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'
>>>
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 09:12
von Hofei
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.
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 09:29
von brainstir
Also die Fehlermeldung in Autokey sieht so aus:
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
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.
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 09:41
von pixewakb
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).
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 10:27
von brainstir
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..
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 10:44
von noisefloor
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
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 10:53
von __deets__
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.
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?
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 13:45
von Sirius3
@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.
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 14:48
von brainstir
@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:
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)
Re: ganze .py importieren
Verfasst: Donnerstag 1. März 2018, 22:40
von pixewakb
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.