2010-12-06 13 views
6

por favor asesorar: ¿puede esto ser superado de alguna manera? ¿Puede un proceso secundario crear un subproceso?subproceso python que utiliza el subproceso de importación

El problema es que tengo una aplicación lista que necesita llamar al script de python. Esta secuencia de comandos funciona perfectamente, pero necesita llamar a las secuencias de comandos existentes. Esquemáticamente el problema es el siguiente código:

parent.py

import subprocess 
subprocess.call(['/usr/sfw/bin/python', '/usr/apps/openet/bmsystest/relAuto/variousSW/child.py','1', '2']) 

child.py

import sys 
import subprocess 
print sys.argv[0] 
print sys.argv[1] 

subprocess.call(['ls -l'], shell=True) 
exit 

Correr child.py parent.py

python child.py 1 2 
    all is ok 

Correr

python parent.py 
Traceback (most recent call last): 
    File "/usr/apps/openet/bmsystest/relAuto/variousSW/child.py", line 2, in ? 
    import subprocess 
ImportError: No module named subprocess 

Muchas gracias apllom

+0

Esto está en Solaris 2.6.2 - ¿probó estos ejemplos en una plataforma diferente? – apllom

+0

Lo sentimos: Solaris 10, python 2.6.2 se construyó a partir de la fuente – apllom

+0

Debería funcionar. Ver mi respuestaTengo la corazonada de que estás usando dos ejecutables de Python diferentes. – pyfunc

Respuesta

1

There should be nothing stopping you from using subprocess in both child.py and parent.py

soy capaz de ejecutarlo perfectamente bien. :)

problema de depuración:

You are using python and /usr/sfw/bin/python .

  1. Está pitón desnudo apuntando a la misma pitón?
  2. ¿Puedes verificar escribiendo 'which python'?

Estoy seguro de que si hiciste lo siguiente, te funcionará.

/usr/sfw/bin/python parent.py 

Alternativamente, puede cambiar sus parent.py code a

import subprocess 
subprocess.call(['python', '/usr/apps/openet/bmsystest/relAuto/variousSW/child.py','1', '2']) 
+0

Supongo que el problema es la ruta de búsqueda del módulo, a diferencia del código en sí. Así que sí, respuesta próxima. :) – MrGomez

+0

sí, estoy usando el mismo pitón que python /usr/sfw/bin/python – apllom

+0

el mismo error con/usr/sfw/bin/python parent.py – apllom

0

usando subprocess.call no es la forma correcta de hacerlo. En mi opinión, subprocess.Popen sería mejor.

parent.py:

1 import subprocess 
2 
3 process = subprocess.Popen(['python', './child.py', 'arg1', 'arg2'],\ 
4   stdin=subprocess.PIPE, stdout=subprocess.PIPE,\ 
5   stderr=subprocess.PIPE) 
6 process.wait() 
7 print process.stdout.read() 

child.py

1 import subprocess 
2 import sys 
3 
4 print sys.argv[1:] 
5 
6 process = subprocess.Popen(['ls', '-a'], stdout = subprocess.PIPE) 
7 
8 process.wait() 
9 print process.stdout.read() 

Fuera de programa:

python parent.py 
['arg1', 'arg2'] 
. 
.. 
chid.py 
child.py 
.child.py.swp 
parent.py 
.ropeproject 
0

Usted puede tratar de añadir el directorio de pitón a sys.path en chield .py

import sys 
sys.path.append('../') 

Sí, es una mala manera, pero puede ayudarte.

Cuestiones relacionadas