Kompilieren von psutil in eine .pyd Datei

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
HarryPotter
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 16:07

Hallo zusammen :),

ich habe ein Problem, bei dem ich gerade nicht weiterkomme.

Ich möchte ein .pyd File erzeugen, das aus dem Modul psutil besteht.
Man kann psutil einfach installieren, aber diese Möglichkeit besteht bei mir nicht, da ich in dem System nichts installieren kann (Keine Rechte).

Nun habe ich versucht ein .pyd Format aus psutil zu erzeugen (per setuptools)

Zunächst habe ich alle .py Dateien in .c Dateien per cythonize umgewandelt.


Mein Code:
######################
from setuptools import Extension, setup, find_packages
from Cython.Build import cythonize
from Cython.Distutils import build_ext

packages = find_packages()
print(packages)

init = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\__init__.c"],
include_dirs=['include']
)

common = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_common.c"],
include_dirs=['include']
)
compat = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_compat.c"],
include_dirs=['include']
)
psaix = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_psaix.c"],
include_dirs=['include']
)
psbsd = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_psbsd.c"],
include_dirs=['include']
)
pslinux = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_pslinux.c"],
include_dirs=['include']
)
psosx = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_psosx.c"],
include_dirs=['include']
)
psposix = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_psposix.c"],
include_dirs=['include']
)
pssunos = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_pssunos.c"],
include_dirs=['include']
)
pswindows = Extension(
'psutils',
sources=[r"D:\testumgebung\venv\Lib\site-packages\psutil\_pswindows.c"],
include_dirs=['include']
)
setup(name='pyutil_comp',
author="xxx",
author_email="xxx",
version='1.0',
description='compile psutil',
packages=packages,
ext_modules=[init, common, compat, psaix, psbsd, pslinux, psosx, psposix, pssunos, pswindows],
)
###################################

zum kompilieren der .c habe ich denselben Code verwendet, bloß mit ext_modules=cythonize() für jede einzelne Datei.

Es wurde auch ein .pyd File erzeugt, welches ich in dem Pfad D:\testumgebung\code\psutil_comp hinterlegt habe. Beim ausführen erkennt das Script aber net_connections
nicht.

#############################################
import sys
sys.path.append(r'D:\testumgebung\code\psutil_comp')

import psutil

for port in psutil.net_connections(kind='tcp'):
if port.laddr[1] == 5112 and port.pid != 0:
print(port)
#############################################

Fehlermeldung:
Traceback (most recent call last):
File "D:\testumgebung\code\psutil_comp\check_psutil.py", line 6, in <module>
for port in psutil.net_connections(kind='tcp'):
AttributeError: module 'psutil' has no attribute 'net_connections'


Kann mir vielleicht jemand weiterhelfen?

Danke für eure Hilfe :)

Viele Grüße :)
Danke und viele Grüße :)
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso kannst du eine DLL installieren, aber kein Paket? Das ergibt keinen Sinn. Du kannst Python auch Module aus anderen Orten "vorwerfen", zB ueber PYTHONPATH als erste Massnahme.
HarryPotter
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 16:07

Danke für die schnelle Antwort :)

Installieren kann ich nichts. Das dll soll vom Anwender einfach nur in einem Pfad abgelegt werden.

Es existiert eine Python Umgebung, auf die ich aber keinen Zugriff habe. Daher versuche ich diesen Weg.

Das dll soll ich aber zur Verfügung stellen.

Meinst du mit "vorwerfen", dass ich das dll in ein PYTHONPATH ablegen soll?

Wenn ja, dann kann ich das dem Anwender machen lassen.

Ich bin mit dll nicht sehr gut vertraut.
Danke und viele Grüße :)
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja, wenn der Python-Interpreter eine DLL von einem Ort, an dem du ihm gesagt hast, dass er da nach Python-Paketen schauen kann, dann kann er das auch gleich mit einem Paket machen. Ohne das vorher kompliziert zu einem PYD bauen zu muessen. PYTHONPATH ist eine Moeglichkeit. Du kannst auch dein Programm den sys.path modifizieren lassen, bevor das psutils importiert wird, zB durch ein Start-Skript. Etc pp.
HarryPotter
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 16:07

Ich muss mich entschuldigen für die späte Reaktion (Vorweihnachtszeit war stressig).

Ich hätte eine allgemeine Frage, die du mir vielleicht beantworten kannst.

Kurz zum Szenario:
Wir haben in Python 3.8.3 ein Bildverarbeitungs-Tool geschrieben.

Nun soll das Tool weitergegeben werden, damit die das Tool auch nutzen können.

Problem hierbei ist aber, dass die Kollegen andere Versionen verwenden (BSP: Python 3.6.0, oder Python 3.10.1)
Wir benötigen für das Tool aber die Version 3.8.3.

Gibt es eine Möglichkeit, dass Tool von uns unabhängig von der Version zu machen? (bspw. eine EXE)
Also quasi das Tool ablegen und einfach laufen lassen, ohne eine Installation von Python 3.8.3.

Weitere Info.
Der Anwender soll das Bildverarbeitungs-Tool über HTTP Anfragen steuern.
Wenn du mehr Infos brauchst, dann gebe ich dir die natürlich :)

Danke für deine bzw. eure Hilfe :)
Danke und viele Grüße :)
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dazu gibt es Tools wie pyinstaller. Die buendeln unter der Haube den benoetigten Interpreter und alle Abhaengigkeiten, und fuehren das ganze dann aus. Kommt sich auch nicht in die Quere mit anderen Python-Interpretern auf dem System.
HarryPotter
User
Beiträge: 12
Registriert: Dienstag 5. November 2019, 16:07

Danke dir :)
Dann werde ich mir das mal anschauen!
Danke und viele Grüße :)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Problem hierbei ist aber, dass die Kollegen andere Versionen verwenden (BSP: Python 3.6.0, oder Python 3.10.1)
Wir benötigen für das Tool aber die Version 3.8.3.
Python 3.6 ist EOL
Python 3.8 hat noch Support bis Oktober 2024 und ist danach End of Life.

Ich würde darauf bestehen, die aktuellste Python-Version einzusetzen und die Begründung ist ganz einfach: bessere Fehlermeldungen und bessere Performance: https://www.phoronix.com/review/python-311-performance

Falls Python auf älteren Windows Versionen eingesetzt werden soll, muss man aber ältere Python-Versionen verwenden.

Hier eine Übersicht: https://pythondev.readthedocs.io/platforms.html#windows
Mit Windows 7 könnte man nur bis Python 3.8 einsetzen und bei Python 3.9 ist der Support von Windows 7 entfernt worden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Python-Pakete kann man immer auch in einem Virtuellen Environment lokal installieren.
Daher würde ich Dein Python-Paket mit einem Requiements-File ausliefern, so dass jeder für seine Python-Version das passende VEnv erzeugen kann.

@DeaD_EyE: so einfach ist die Welt nicht. psutil-wheels existieren z.B. für Python 3.11 noch nicht.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

DeaD_EyE: so einfach ist die Welt nicht. psutil-wheels existieren z.B. für Python 3.11 noch nicht.
Habe sie gerade heruntergeladen :-)

Code: Alles auswählen

[deadeye@nexus ~]$ pip wheel psutil
Collecting psutil
  Downloading psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (280 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 280.2/280.2 kB 4.7 MB/s eta 0:00:00
Saved ./psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl

[deadeye@nexus ~]$ pip install psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl 
Processing ./psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Installing collected packages: psutil
Successfully installed psutil-5.9.4
[deadeye@nexus ~]$
Vorher musste ich psutil bei Python 3.11.1 explizit deinstallieren, damit ich aus dem Wheel das Paket installieren kann.

Noch mal der Test, ob das Paket wirklich installiert worden ist:

Code: Alles auswählen

[deadeye@nexus ~]$ ipython
Python 3.11.1 (main, Dec  7 2022, 15:17:55) [GCC 12.2.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.7.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import psutil

In [2]: psutil.__version__
Out[2]: '5.9.4'

In [3]: psutil.__file__
Out[3]: '/home/deadeye/.pyenv/versions/3.11.1/lib/python3.11/site-packages/psutil/__init__.py'

Wenn keine Wheel existiert, wird eine aus dem Quellcode gebaut.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten