os.system, comandi consecutivi

Stato
Discussione chiusa ad ulteriori risposte.

HackLife

Utente Silver
26 Maggio 2008
57
11
0
73
Ciao,
ho bisogno di aiuto per risolvere questo problema, legato allo sviluppo del mio software MiDe: per l'esecuzione di files java devo prima posizionarmi nella loro cartella, e poi dare java NomeFile. Non so come posso fare per farlo con os.system; infatti non funzionano os.system('java PercorsoFile') né os.system('cd Desktop') seguito da os.system('java NomeFile'). Come posso fare? Grazie.
 
beh.. a sto punto ti conviene generare un file .bat dove metti i comandi che devi dare..
Codice:
cd C:\percorso
java file
pause
lo salvi e lo fai avviare da Python
 
precisazioni: da quello che sembra sei su windows quindi dovresti fare:

os.system("PercorsoProgrammaJava\\java.exe Percorso\\NomeFile")

così dovrebbe andare. Oppure tentare direttamenete con os.popen, che è analogo ma + "a basso livello".

usare un batch è scomodo......... ti tocca crearlo ogni volta...... o cmq controllare che nn venga cancellato. in teoria come ho detto io dovrebbe andare, sennò riportami che errori ti dà... ne ho passate tante tentando di creare una shell che sostituisse cmd, e queste funzioni le conosco abbastanza bene....
 
popen...analogalmente al C penso apra una pipe sul file il che è molto diverso di una semplice system...molto più performante una pipe...
 
Malex ha detto:
precisazioni: da quello che sembra sei su windows quindi dovresti fare:

os.system("PercorsoProgrammaJava\\java.exe Percorso\\NomeFile")

così dovrebbe andare. Oppure tentare direttamenete con os.popen, che è analogo ma + "a basso livello".

usare un batch è scomodo......... ti tocca crearlo ogni volta...... o cmq controllare che nn venga cancellato. in teoria come ho detto io dovrebbe andare, sennò riportami che errori ti dà... ne ho passate tante tentando di creare una shell che sostituisse cmd, e queste funzioni le conosco abbastanza bene....

ha già provato a farlo e gli da errore
Codice:
C:\Users\...>java "C:\Users\...\Desktop\jmath"
Exception in thread "main" java.lang.NoClassDefFoundError: C:\Users\...\Desktop\jmath
Caused by: java.lang.ClassNotFoundException: C:\Users\...\Desktop\jm
ath
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: C:\Users\Riccardo Fadiga\Desktop\jmath.  Program
will exit.
leggi la prima riga.
 
Uhm Malex intanto grazie per l'offerta ^^'', però non mi è molto chiaro se il comando che dici tu,
os.system("PercorsoProgrammaJava\\java.exe Percorso\\NomeFile")
debba servire per compilare o per eseguire, o per entrambi. Avevo tentato di usare popen2, popen ancora no, magari faccio qualche esperimento anche con lui ;)
 
Malex ha detto:
ma in teoria il nome del file nn va passato senza virgolette? e con alla fine l'estensione del file?

Apparte il fatto che il path contiene spazi, e quindi vanno le virgolette. Inoltre qui non stiamo parlando di 'compilazione', si presuppone che il file sia già stato compilato con il comando javac nomefile.java. Una volta fatto questo processo viene generato un file nomefile.class, che viene eseguito tramite java nomefile. (ed è il comando che deve dare)
 
No, nel modo suggerito da malex non riesco.
Sempre a questo riguardo, c'è un modo per settare dove vada a finire l'output del cmd? In modo che non mi si apra una nuova ifnestrella ogni volta? ho provato a fare un textCtrl e a fare:
i, o = os.popen2('start exc.bat')
AppendText(o.read())
ma stranamente o.read() = ''...
 
beh a te ti si apre una sola finestra del cmd, che è quella dove viene avviato il programma Java.
Puoi indirizzare l'output sul file quando dai il comando (ad esempio java file > out.txt, su out.txt hai l'output).. e poi leggerlo..
 
guarda, io sono rimasto a python 2.5.2, cmq almeno lì popen e popen2 sono praticamente la stessa cosa.

cmq ti faccio un esempio di popen testato e quindi sicuramente funzionante:

Codice:
import os
a=os.popen("dir")
print a.read()
e così mi stampa ciò che ho richiesto. quindi prova a mettere popen e basta, nn credo ti servano entrambi i ritorni di popen2.

in pratica popen2 crea 2 pipe, la prima di scrittura la seconda di lettura, e a me cmq nn dà i problemi dati a te.


EDIT: ho capito il perché del problema: tu dai "start blabla", quindi o contiene l'output del comando start, mentre ciò che viene nella finestra aperta dallo start nn viene salvato nel pipe. Prova a mettere solo popen2("exc.bat"), così nn ti si apre la schermata nera e l'output dovrebbe salvarsi giustamente in o.
 
uhm.. se faccio com edici tu neanche parte exc.bat...
Codice:
            exc = open('exc.bat','w')
            exc.write('@echo off \n'+
                       'javac "'+path+'"\n'+
                       'cd "'+path[:-(len(filename)+len('.java'))]+'"\n'+
                       'java '+filename)
            i,o = os.popen2('exc.bat')
            print o.read()
e jmath non viene neanche compilato :(

@Stoner: l'avevo provato e in realtà stavo indagando se fosse possibile indirizzare l'output non su un file ma su una finestra di cmd già aperta o su un altro tipo di "supporto"...
In realtà sono sicuro che ci sia un modo più semplice per svolgere tutto questo, cioé riuscire a dare comandi consecutivi uno all'altro nel prompt. Non c'è un modo di scrivere su una sola riga più righe logiche? Il ; non serve, ho provato. Non posso credere che siamo arrivati a sti livelli xD
 
un attimo che verifico, cmq sarebbe una buona cosa identare nel modo giusto, e cmq quando scrivi un file dopo chiudilo
exc.close()

edit: io nn ho java installato, quindi ho fatto una prova un po' alla c***o di cane cioè:
Codice:
exc = open('exc.bat','w')
exc.write('echo "ciao"')
exc.close()
i,o = os.popen2('exc.bat')
print o.read()

e mi printa giustamente "ciao", quindi prova a mettere il close()
 
[ot]il pythoniano colpisce ancora asd[/ot]


lol...... di dove sei così ne approfitto? (asd)

cmq ricordati che in python il file finché nn lo chiudi (o termina il programma) nn viene salvato, ma ti resta il file vuoto.

Alla prossima XD ;)
 
Scusa ma mi è venut un dubbio non atroce, atrocissimo. Se il programma richiede input? Sono fottuto o si può usare quel secondo pipe di popen2?
 
Stato
Discussione chiusa ad ulteriori risposte.