ganze .py importieren

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 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.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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

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()
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Ohne es zu testen und nur nach Bauchgefühl: Schreibst Du den Modulnamen vor die importierten Funktionen bei deren Verwendung?
brainstir
User
Beiträge: 25
Registriert: Dienstag 26. September 2017, 08:36

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.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

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'
>>> 
Hofei
User
Beiträge: 14
Registriert: Freitag 6. Januar 2017, 20:15

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

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.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

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

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..
Benutzeravatar
noisefloor
User
Beiträge: 3853
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
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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

@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)
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

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.
Antworten