我有一个 test.bat 文件,这个 bat 里边调用了一些 exe 可执行文件
我在 python 交互模式下,执行 os.system("C:\Users\Desktop\test.bat"),程序是正常执行的,里边的 exe 文件也成功执行,可是我用函数地封装了一下,放到一个.py 文件里运行时,发现这句 os.system("C:\Users\Desktop\test.bat")没有执行(是根据 bat 里边的 exe 是否执行来判断的,但这里,并没有调用到 exe 文件),但返回值是 0 (按道理来说,0 就代表执行成功),找不到什么原因,请教下各位大佬,这是什么原因?
1
arthasgxy 2018-11-07 21:11:12 +08:00
猜测哈,
python 下 os.system 是不等待的,你直接执行,然后是会返回 0 (我记得是),然后继续执行下面的东西。 这时候如果你下面没了(好污),python 直接 over 了,但 os.system 还没执行完,会不会直接被 kill 了? 造成没有执行的结果。 你试着加个 sleep,或者改成 popen ? |
2
css3 OP @arthasgxy python 交互模式下,os.system 是可以完整运行结束的,为啥会等待啊?
|
3
takeoffyoung 2018-11-07 21:26:11 +08:00
@arthasgxy os.system 并非异步
|
4
takeoffyoung 2018-11-07 21:33:02 +08:00
os.system fork 了一个子进程。
在 REPL 中,父进程始终阻塞,子进程可以正常存活。 执行 py 文件时,父进程退出,子进程亦结束。 |
5
arthasgxy 2018-11-07 21:39:02 +08:00
@takeoffyoung 这样啊,我还以为 win 下没有 fork 呢
|
6
css3 OP @takeoffyoung 那请教一下如何解决这个问题?
|
8
css3 OP @arthasgxy sleep ?这个不太好啊,bat 这个时间不定的,经常会更改这个文件,执行时间不定
,popen 还没试,待会儿试试 |
10
zk8802 2018-11-08 09:49:14 +08:00 via iPhone
- 你的 bat 文件中用的都是绝对路径吗?
- 你把 bat 文件的内容换成 echo “ Hello world ” 试试,看看有没有输出。 |
11
css3 OP @zk8802 原来是相对路径,刚改成绝对路径了,echo “ Hello world ” 是可以输出出来的,但现在 exe 还是执行不到,bat 有点复杂,感觉用 python 调用 bat,是不是不太现实?
|
12
zk8802 2018-11-08 10:07:22 +08:00 via iPhone
你把要执行的 exe 换成 notepad.exe 试试,看看记事本会不会弹出来。如果可以的话,可能是你要执行的 exe 程序对环境有一些特殊要求。
|
14
zk8802 2018-11-08 11:01:58 +08:00 via iPhone
你可以用 subprocess.Popen(),然后传入一个正确的 cwd。
|