Python子进程调用另一个不生成输出的py

时间:2015-03-27 18:31:15

标签: python subprocess

我有2个程序,一个是通过子进程调用另一个。在pyCharm中运行它。我的问题是对第二个程序的调用不打印出所需的字符串(参见程序)。我做错了什么,或者我对子流程的理解是错误的?

这是something.py:

import subprocess
def func():
    print("this is something")
    sb = subprocess.call("diff.py", shell=True)
return sb


if __name__=="__main__":
   func()

这是diff.py:

print("this is diff running")

def caller():
    print("this is diff running called from name main")


if __name__=="__main__":
    caller()

我决定尝试子进程而不是导入,以便将来在diff线程中同时运行调用。现在我只是想确保我掌握子处理,但是我已经陷入了这个问题的基本层面并且弄明白了。

3 个答案:

答案 0 :(得分:0)

你必须使用python来运行python文件。

import subprocess
def func():
    print("this is something")
    sb = subprocess.call("python diff.py", shell=True)
    # It is also important to keep returns in functions
    return sb


if __name__=="__main__":
   func()

我会小心理解pycharm如何保存文件的布局。如果您只是想了解子进程模块,也许可以考虑尝试运行已经存在的Windows命令行的程序。

import subprocess
print("this is where command prompt is located")
sb = subprocess.call("where cmd.exe", shell=True)

返回

this is where command prompt is located
C:\Windows\System32\cmd.exe

答案 1 :(得分:0)

谢谢。 subprocess.call(“python something.py”,shell = True)现在按预期工作但由于某种原因来自pyCharm的同一调用不会从diff.py返回第二个字符串我假设问题是pyCharm然后

答案 2 :(得分:0)

使用运行父脚本的相同Python解释器从当前目录运行diff.py脚本:

#!/usr/bin/env python
import sys
from subprocess import check_call

check_call([sys.executable, 'diff.py'])
  • 除非有必要,否则不要使用shell=True,除非您需要运行内部命令,例如dir,否则在大多数情况下您不需要shell=True
  • 如果子脚本返回非零退出代码,则使用check_call()代替call()引发异常

  

为什么[当]我尝试python的东西.py pyCharm会解释它。

你应该associate .py extension with py (Python launcher)。虽然如果运行命令:

T:\> python something.py

字面意思是打开PyCharm并打开文件something.py,而不是使用Python解释器运行脚本然后真的被打破了。找出运行的程序,然后键入python(不带参数)。

确保您了解:

之间的区别
subprocess.Popen(['python', 'diff.py']) 
subprocess.Popen('diff.py')
subprocess.Popen('diff.py', shell=True)
os.startfile('diff.py')
os.startfile('diff.py', 'edit')

尝试从命令行(cmd.exe)和IDLE(python3 -m idlelib)运行它,看看每种情况会发生什么。


您应该更喜欢导入Python模块并在必要时使用multiprocessingthreading模块来运行相应的函数,而不是通过subprocess模块将Python脚本作为子进程运行。