我有2个程序,一个是通过子进程调用另一个。在pyCharm中运行它。我的问题是对第二个程序的调用不打印出所需的字符串(参见程序)。我做错了什么,或者我对子流程的理解是错误的?
import subprocess
def func():
print("this is something")
sb = subprocess.call("diff.py", shell=True)
return sb
if __name__=="__main__":
func()
print("this is diff running")
def caller():
print("this is diff running called from name main")
if __name__=="__main__":
caller()
我决定尝试子进程而不是导入,以便将来在diff线程中同时运行调用。现在我只是想确保我掌握子处理,但是我已经陷入了这个问题的基本层面并且弄明白了。
答案 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模块并在必要时使用multiprocessing
,threading
模块来运行相应的函数,而不是通过subprocess
模块将Python脚本作为子进程运行。