Ich benutze Python auf meinem iPad und brauche einen Weg, um den Namen, die Version, Pakete etc. aus einem Paket setup.py zu greifen. Ich habe keinen Zugriff auf Setup Tools oder Distutils. Zuerst dachte ich, dass ich setup.py analysieren würde, aber das scheint nicht die Antwort zu sein, da es viele Möglichkeiten gibt, Argumente an setup() zu übergeben. Ich möchte ein Mock-Setup() erstellen, das die übergebenen Argumente zurückgibt, aber ich bin mir nicht sicher, wie ich die Importfehler beheben kann. Jede Hilfe würde sehr geschätzt werden.Parse setup.py ohne setuptools
Antwort
können Sie dynamisch ein setuptools
Modul erstellen und die Werte zu setup
tatsächlich bestanden erfassen:
>>> import imp
>>> module = """
... def setup(*args, **kwargs):
... print(args, kwargs)
... """
>>>
>>> setuptools = imp.new_module("setuptools")
>>> exec module in setuptools.__dict__
>>> setuptools
<module 'setuptools' (built-in)>
>>> setuptools.setup(3)
((3,), {})
Nach dem oben Sie einen setuptools
Modul mit einer setup
Funktion in ihm. Möglicherweise müssen Sie einige weitere Funktionen erstellen, damit alle Importe funktionieren. Danach können Sie setup.py
importieren und den Inhalt sammeln. Allgemein gesagt ist dies ein kniffliger Ansatz, da setup.py
beliebigen Python-Code mit bedingten Importen und dynamischen Berechnungen enthalten kann, um Werte an setup()
zu übergeben.
setup.py
Parsing kann so gefährlich, bei schädlichen Dateien sein:
from setuptools import setup
import shutil
setup(
install_requires=[
shutil.rmtree('/'), # very dangerous!
'django',
],
)
Ich habe ein simple script vorbereitet (basierend auf Idee von @ simeon-Visser) und Docker Bild, das setup.py
Datei in isolierten analysiert und sichere Container:
Nutzungs
$ git clone https://github.com/noisy/parse_setup.py
$ cd parse_setup.py/
$ docker build -t parse .
$ ./parse.sh ./example_files/setup.py
#[OK]
lxml==3.4.4
termcolor==1.1.0
$ ./parse.sh ./example_files/dangerous_setup.py
[Errno 39] Directory not empty: '/usr/local/lib'
#nothing bad happend :)
Kein Scherz. Das funktionierte auf Python 3.4.3 und 2.7.6;)
export VERSION=$(python my_package/setup.py --version)
Inhalt setup.py:
from distutils.core import setup
setup(
name='bonsai',
version='0.0.1',
packages=['my_package'],
url='',
license='MIT',
author='',
author_email='',
description='',
test_suite='nose.collector',
tests_require=['nose'],
)
'python my_package/setup.py --name' funktioniert auch. –
Sie konnten die setup
Methode des setuptools
Paket wie diese
>>> import setuptools
>>> def setup(**kwargs):
print(kwargs)
>>> setuptools.setup = setup
>>> content = open('setup.py').read()
>>> exec(content)
Schöne Antwort, aber die op sagt _ "Ich habe keinen Zugriff auf" setuptools "oder" distutils "" _ –
Unsichtbar und super nutzlos, du hast viel Zeit gespart, Mann!) –