V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
css3
V2EX  ›  Python

Python 交互模式与函数调用模式,效果不一样是怎么回事

  •  
  •   css3 · 2018-11-07 21:05:34 +08:00 · 1951 次点击
    这是一个创建于 2209 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个 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 就代表执行成功),找不到什么原因,请教下各位大佬,这是什么原因?

    15 条回复    2018-11-08 13:54:22 +08:00
    arthasgxy
        1
    arthasgxy  
       2018-11-07 21:11:12 +08:00
    猜测哈,
    python 下 os.system 是不等待的,你直接执行,然后是会返回 0 (我记得是),然后继续执行下面的东西。
    这时候如果你下面没了(好污),python 直接 over 了,但 os.system 还没执行完,会不会直接被 kill 了?
    造成没有执行的结果。

    你试着加个 sleep,或者改成 popen ?
    css3
        2
    css3  
    OP
       2018-11-07 21:20:38 +08:00 via iPhone
    @arthasgxy python 交互模式下,os.system 是可以完整运行结束的,为啥会等待啊?
    takeoffyoung
        3
    takeoffyoung  
       2018-11-07 21:26:11 +08:00
    @arthasgxy os.system 并非异步
    takeoffyoung
        4
    takeoffyoung  
       2018-11-07 21:33:02 +08:00
    os.system fork 了一个子进程。
    在 REPL 中,父进程始终阻塞,子进程可以正常存活。
    执行 py 文件时,父进程退出,子进程亦结束。
    arthasgxy
        5
    arthasgxy  
       2018-11-07 21:39:02 +08:00
    @takeoffyoung 这样啊,我还以为 win 下没有 fork 呢
    css3
        6
    css3  
    OP
       2018-11-07 21:39:53 +08:00 via iPhone
    @takeoffyoung 那请教一下如何解决这个问题?
    arthasgxy
        7
    arthasgxy  
       2018-11-07 21:46:06 +08:00
    @css3 不是给你解决方案了么,
    css3
        8
    css3  
    OP
       2018-11-07 21:52:41 +08:00 via iPhone
    @arthasgxy sleep ?这个不太好啊,bat 这个时间不定的,经常会更改这个文件,执行时间不定
    ,popen 还没试,待会儿试试
    css3
        9
    css3  
    OP
       2018-11-08 09:39:28 +08:00
    @arthasgxy 2 个方法都没有,都是返回 0 就退出了
    zk8802
        10
    zk8802  
       2018-11-08 09:49:14 +08:00 via iPhone
    - 你的 bat 文件中用的都是绝对路径吗?
    - 你把 bat 文件的内容换成 echo “ Hello world ” 试试,看看有没有输出。
    css3
        11
    css3  
    OP
       2018-11-08 09:51:44 +08:00
    @zk8802 原来是相对路径,刚改成绝对路径了,echo “ Hello world ” 是可以输出出来的,但现在 exe 还是执行不到,bat 有点复杂,感觉用 python 调用 bat,是不是不太现实?
    zk8802
        12
    zk8802  
       2018-11-08 10:07:22 +08:00 via iPhone
    你把要执行的 exe 换成 notepad.exe 试试,看看记事本会不会弹出来。如果可以的话,可能是你要执行的 exe 程序对环境有一些特殊要求。
    css3
        13
    css3  
    OP
       2018-11-08 10:26:29 +08:00
    @zk8802 我把里边所有的变量都换成绝对路径,现在可以执行了,但 exe 内部又有些相对路径有问题了,还在折腾中
    zk8802
        14
    zk8802  
       2018-11-08 11:01:58 +08:00 via iPhone
    你可以用 subprocess.Popen(),然后传入一个正确的 cwd。
    css3
        15
    css3  
    OP
       2018-11-08 13:54:22 +08:00
    @zk8802 现在可以执行了,但就是所有涉及到路径都是绝对路径,相对路径识别不了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.