2015-01-06 11 views
6

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

4

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.

+0

Unsichtbar und super nutzlos, du hast viel Zeit gespart, Mann!) –

0

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 :) 
3

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'], 
) 
+1

'python my_package/setup.py --name' funktioniert auch. –

0

Sie konnten die setup Methode des setuptools Paket wie diese

ersetzen
>>> import setuptools 
>>> def setup(**kwargs): 
     print(kwargs) 
>>> setuptools.setup = setup 
>>> content = open('setup.py').read() 
>>> exec(content) 
+0

Schöne Antwort, aber die op sagt _ "Ich habe keinen Zugriff auf" setuptools "oder" distutils "" _ –