2015-07-25 11 views
9

Sto cercando di installare un pacchetto con setuptools tra cui console_scripts su Windows 7. Sto cercando di cambiare il valore della mia PYTHONUSERBASE da installare in una directory personalizzata con la bandiera --user . Se uso backslash nel valore della PYTHONUSERBASE, come inPython setuptools è spogliando tagli da argomenti di percorso su Windows

set PYTHONUSERBASE=C:\testing 

tutto funziona bene. Tuttavia, se uso una barra, come in

set PYTHONUSERBASE=C:/testing 

il pacchetto si installa nel posto giusto, ma il console_scripts (e solo la console_scripts) sono installati in C:testing\Scripts. Ovviamente, quando è presente la barra diretta, setuptools considera il percorso come percorso relativo solo per lo console_scripts. Nel mio vero pacchetto, sto leggendo i valori da un file di configurazione, quindi preferirei non avere a che fare con la normalizzazione del separatore dei percorsi poiché ha bisogno di lavorare anche su Linux. Per il test, ho un pacchetto con la struttura

|-- setup.py 
|-- foobar\ 
|---- __init__.py 
|---- __main__.py 

Il codice nel __main__.py è

def main(): print('This is the main function') 

e setup.py assomiglia:

from setuptools import setup 

setup(
    name='foobar', 
    version='1.0.0', 
    packages=['foobar'], 
    entry_points={ 
     'console_scripts': [ 
      'foobar=foobar.__main__:main', 
     ], 
    }, 
) 

Perché setuptools escludendo la prima in avanti tagliare il percorso e come posso ripararlo? Credo che questa domanda è legata al mio problema, ma io non credo che risolve: Python os.path.join on Windows

+0

Non ho idea del perché setuptools stia facendo questo, ma potresti essere in grado di fare qualcosa nella tua funzione di configurazione come 'if 'PYTHONUSERBASE' in os.environ: os.environ ['PYTHONUSERBASE'] = os.environ [' PYTHONUSERBASE ']. Replace ('/', os.sep) ' –

+0

@PatrickMaupin Stavo pensando a qualcosa del genere ... In realtà uso SCons per costruire il vero progetto, quindi stavo cercando di vedere se potevo gestirlo in il file di SConstruct pure. Penso che sarebbe probabilmente meglio usare 'os.path.normpath' piuttosto che sostituire esplicitamente le barre. Grazie! – darthbith

+0

È un piano. Dimentico che normpath() lo farà perché è un comportamento specifico di Windows (su Linux, non cambierà i backslash in barre) e non userò Windows. In bocca al lupo! –

risposta

6

La risposta breve è che Windows non funziona bene con slash nel nome del percorso - come documentato here. Evitare di impostare la variabile d'ambiente PYTHONUSERBASE con un nome simile.

La versione più lunga è che setuptools normalizza la maggior parte dei suoi nomi di percorso (che converte/in \ su versioni di Windows di Python) direttamente o chiamando il percorso abs. Tuttavia non lo fa per il nome della directory che usa durante la creazione di script (vedere write_script in this file).

Si vede quindi un comportamento incoerente tra gli script e altri file. La soluzione è evitare di dover normalizzare i file evitando le barre in avanti nei percorsi.

Se si sta leggendo il percorso da un file di configurazione e quindi si utilizza quello per impostare PYTHONUSERBASE, utilizzare semplicemente os.path.normpath per convertire da Linux a nomi di file di Windows. Questo va bene su Linux in quanto non avrà alcun effetto sulle barre.

+1

Probabilmente un bug in 'write_script()' direi. Bella risposta. –

+0

Grazie! Questo è più o meno dove ho finito, usando 'normpath' per risolvere il problema.Sono d'accordo con @JRichardSnape però, che questo sembra un bug in 'write_script()', o almeno, dovrebbe essere documentato ... – darthbith