La risposta giusta è:
py2output = subprocess.check_output(['python','py2.py','-i', 'test.txt'])
Per dimostrare, qui sono i miei due programmi:
py2.py:
import sys
print sys.argv
py3.py:
import subprocess
py2output = subprocess.check_output(['python', 'py2.py', '-i', 'test.txt'])
print('py2 said:', py2output)
eseguirlo :
$ python3 py3.py
py2 said: b"['py2.py', '-i', 'test.txt']\n"
Ecco cosa c'è di sbagliato con ciascuno dei vostri versioni:
py2output = subprocess.check_output([str('python py2.py '),'-i', 'test.txt'])
In primo luogo, str('python py2.py')
è esattamente la stessa cosa di 'python py2.py'
-Sei prendere una str
, e chiamando str
per convertirlo in un str
. Ciò rende il codice più difficile da leggere, più lungo e persino più lento, senza aggiungere alcun vantaggio.
Più seriamente, python py2.py
non può essere un singolo argomento, a meno che non si stia effettivamente tentando di eseguire un programma denominato, ad esempio, /usr/bin/python\ py2.py
. Quale non sei; stai cercando di eseguire, ad esempio, /usr/bin/python
con il primo argomento py2.py
. Quindi, è necessario renderli elementi separati nella lista.
La tua seconda versione lo risolve, ma ti manca lo '
prima dello test.txt'
. Questo dovrebbe darti un SyntaxError
, probabilmente dicendo EOL while scanning string literal
.
Nel frattempo, non sono sicuro di come abbia trovato la documentazione ma non è stato possibile trovare alcun esempio con argomenti. Il primo esempio è:
>>> subprocess.check_output(["echo", "Hello World!"])
b'Hello World!\n'
che chiama il comando "echo"
con un ulteriore argomento, "Hello World!"
.
anche:
-i è un argomento posizionale per argparse, test.txt è ciò che il -i è
Sono abbastanza sicuro -i
è non un argomento posizionale, ma un argomento opzionale. Altrimenti, la seconda metà della frase non ha senso.
Che cosa è successo esattamente quando non hanno funzionato? – khagler
Cercando di eseguire un file Python 2 tramite Python 3? No, non succederà. Python 3 non è intenzionalmente retrocompatibile con Python 2. Dovresti eseguire '2to3' per * starters * per far funzionare il tuo file in Python 3. – Makoto
@Makoto: Sta provando a eseguire l'interprete Python 2 all'interno di un Script Python 3, che è perfettamente ragionevole. (E dalla sua domanda precedente, capita di sapere che lo sta facendo in modo specifico come soluzione per esattamente i problemi a cui stai pensando, ma qui non è rilevante.) – abarnert