在Django应用中使用shell命令将输出文件保存在磁盘上

时间:2019-07-16 08:47:58

标签: python django shell

我正在创建一个脚本,以使用Web应用程序运行外壳命令以进行仿真。我想在shell应用程序中运行django命令,然后将输出保存到文件中。

我面临的问题是,在运行shell命令时,输出尝试保存在被理解的被调用的url中(例如:localhost:8000/projects)。

我要将输出保存到例如: /home/myoutput/output.txt而不是/projects/tasks

我必须运行一个完整的脚本,然后将其输出保存到txt文件中,但是一旦完成,这很容易。

尝试使用os.chdir()函数将目录更改为/desiredpath

from subprocess import run

#the function invoked from views.py
def invoke_mpiexec():
  run('echo "this is a test file" > fahadTest.txt')


  

/ projects处的FileNotFoundError

     

异常类型:FileNotFoundError

3 个答案:

答案 0 :(得分:2)

首先,我想说的是,从Django中的Web请求直接调用外部程序有点反模式。首选方法是使用Celeryrq之类的工作队列,但这会增加一些复杂性。

话虽如此,您可以使用参数shell=True解决问题:

from subprocess import run

#the function invoked from views.py
def invoke_mpiexec():
  run('echo "this is a test file" > fahadTest.txt', shell=True)

这里是documentation

  

如果shell为True,则指定的命令将通过   贝壳。如果您主要将Python用于   它为大多数系统外壳提供了增强的控制流程,并且仍然需要   方便使用其他外壳功能,例如外壳管道,   文件名通配符,环境变量扩展和〜的扩展   到用户的主目录。但是请注意,Python本身提供了   许多类似外壳的功能(尤其是glob,   fnmatch,os.walk(),os.path.expandvars(),os.path.expanduser()和   关闭)。

注意:使用shell=True可能会导致security issues

  

如果通过shell = True显式调用了shell,则它是   应用程序有责任确保所有空白和   适当引用元字符以避免注入外壳   漏洞。

答案 1 :(得分:0)

您应将 subprocess.call stdout 参数一起使用

def invoke_mpiexec():
    f = open("fahadTest.txt", "w")
    subprocess.call(['echo', '"this is a test file"'], stdout=f)

或使用写入功能

def invoke_mpiexec():
    f = open('fahadTest.txt', 'w')
    f.write("Now the file has more content!")
    f.close()

答案 2 :(得分:0)

所以我想通了。

下面是解决方法:

run('mkdir -p $HOME/phdata/test/ && echo "this is a test file" > $HOME/phdata/test/fahadTest.txt', shell=True)
  

mkdir -p creates a directory if it doesn't exist

     

$HOME用于转到主目录,从那里您可以   导航到文件夹。

     

shell=True参数需要作为shell命令运行

您还可以创建ssh连接并在远程服务器上运行命令/脚本。为此,我的方法是在远程服务器上创建脚本,通过我的应用程序调用该脚本并为其提供参数。另一个不是很好但是可行的解决方法是使用上面的代码在服务器上创建脚本,然后调用它。