Python subprocess使用import subprocess

9

这个问题能否通过某种方式解决?孩子进程能创建一个子进程吗?

问题在于,我有一个已经准备好的应用程序需要调用一个Python脚本。这个脚本本身运行得非常完美,但是它需要调用现有的shell脚本。

问题的示意代码如下:

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

运行child.py

python child.py 1 2
  all is ok

运行parent.py文件

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

这是在Solaris 2.6.2上的。你有在其他平台上尝试过这些示例吗? - apllom
抱歉 - Solaris 10,python 2.6.2是从源代码构建的。 - apllom
应该可以工作。看看我的答案。我有一种预感,你正在使用两个不同的Python可执行文件。 - pyfunc
3
在 child.py 文件中的 import subprocess 代码行之前,尝试打印 sys.path。将其与正常工作时和出现问题时的情况进行比较。 - Laurence Gonsalves
3个回答

2

在child.py和parent.py中使用subprocess应该没有任何问题。

我能够完美地运行它。 :)

问题调试:

你正在使用python/usr/sfw/bin/python

  1. 裸的python是否指向相同的python?
  2. 你可以通过输入“which python”来检查吗?

我确定如果你按照以下步骤操作,它会为你工作。

/usr/sfw/bin/python parent.py

或者,您可以将parent.py代码更改为

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

我猜问题应该是模块搜索路径的问题,而不是代码本身。所以,是的,答案即将到来。 :) - MrGomez
是的,我正在使用相同的Python。哪个Python?/usr/sfw/bin/python - apllom
与 /usr/sfw/bin/python parent.py 相同的失败 - apllom
没有,Python parent.py 子进程调用.. 回溯(最近的调用最先): 文件“/usr/apps/openet/bmsystest/relAuto/variousSW/child.py”,第2行,在? 导入子进程 导入错误:没有名为子进程的模块 - apllom

0

使用subprocess.call不是正确的方法。在我看来,subprocess.Popen会更好。

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()

程序外:
python parent.py 
['arg1', 'arg2']
.
..
chid.py
child.py
.child.py.swp
parent.py
.ropeproject

0

你可以尝试在 chield.py 中将你的 Python 目录添加到 sys.path 中。

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

是的,这不是一个好方法,但它可以帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接