在 django views.py 中如何调用 .exe 可执行文件?

背景:
课程设计需要涉及到后端调用若干个编译好的 .exe 可执行文件。直接在 test.py 中调用 hello.exe 经测试没有问题,但是在 django views.py 中调用 hello.exe 失败:
'hello.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。

相关环境:
python 3.5 , django 2.1 , IDE: PyCharm 。

相关代码:
test.py

import os  

def ccpp():
    main="hello.exe"
    f = os.popen(main)    
    data = f.readlines()    
    f.close()
    return data

if __name__=='__main__':
    print(ccpp())
    

hello.cpp

#include<iostream>

void test()
{
    std::cout<<"hello"<<std::endl;
}

int main()
{
    test();
    return 0;
}

views.py

def test(ruquest):
    ...
    main="hello.exe"
    f = os.popen(main)    
    data = f.readlines()    
    f.close() 
    ... 

test.py views.py hello.cpp hello.exe 均在同级目录下。

在 test.py 中直接调用结果如下图片描述

views.py 拿到前端请求调用 test() 方法后调用的结果如下
图片描述

阅读 5.9k
2 个回答

路径问题.
os.popen 使用的是当前路径. Python 程序的当前路径一般是指最开始执行的 Python 文件的路径, 可以用os.getcwd()看到.
比如 Django 的官方例子结构:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

如果通过python manage.py runserver运行, 那么当前目录就是mysite/, 这时要将hello.exe放置到和manage.py同一个目录.

或者如果执意要放在和views.py同一目录, 可以这样:

def test(ruquest):
    ...
    main="hello.exe"
    file = os.path.join(os.path.dirname(os.path.abspath(__file__)), main)
    f = os.popen(file)    
    data = f.readlines()    
    f.close() 

参考:stackoverflow: find-current-directory-and-files-directory

在settings.py中有一个BASE_DIR变量表示当前Django项目的目录(绝对路径),所以我一般是这样做的:

  1. 在Django项目目录下创建一个目录,例如program,然后将hello.exe放到program目录下
  2. 在views.py开头加上from django.conf import settings
  3. 在视图函数中,通过os.system(os.path.join(settings.BASE_DIR, 'program', 'hello.exe'))来调用系统shell执行外部程序。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏