【问题标题】:Django Python Script Doesn't Output FilesDjango Python 脚本不输出文件
【发布时间】:2013-10-24 00:07:32
【问题描述】:

我有一个通过 Django 视图执行以下代码的脚本:

# generate dag file
        try:
            commandString = [
                'python',
                os.path.join('/srv/nfsshare/transcode50', userFolder, directory, 'condor_execute.py')
            ]
            subprocess.check_call(commandString,
                            stdout=open('/srv/nfsshare/transcode50/output2.txt', 'w'),
                            stderr=subprocess.STDOUT)
        except Exception, e:
            open('/tmp/test_exception.txt', 'w').write(str(e))
            raise

应该做的是执行我生成的 Python 文件。如果我从服务器的命令提示符(即python /srv/nfsshare/transcode50/cogden/algorithms/condor_execute.py)运行那个确切的命令,它就可以正常工作并生成它应该在该目录中的所需文件。但是,如果我从 Django 运行它,它不会产生错误消息,会产生正确的控制台输出(基本上说“在 blah 处创建文件”的消息),但是当它通常生成两个时,不会产生任何文件。我没有收到任何权限错误或任何东西,并确保目录已正确修改。

【问题讨论】:

  • subprocess.call 不会引发异常,将其替换为 subprocess.check_call 并查看是否引发异常。
  • 我试过了,但仍然没有任何异常!

标签: python django subprocess


【解决方案1】:

我怀疑你的进程永远不会关闭文件(因为你不能明确地这样做,因为你没有引用它 - 当作为脚本运行时 - 解释器会停止 - 但 Django 在加载时的工作方式不同进程等...)并且它不够大,无法刷新 - 尝试移出您的open

with open('/srv/nfsshare/transcode50/output2.txt', 'w') as stdout:   
    subprocess.check_call(commandString, stdout=stdout, stderr=subprocess.STDOUT)

另外,请确保在进行更改时确保 Django 服务器已重新启动/类似以确保重新加载代码并使更改生效。

【讨论】:

  • 您能否指出一个资源的方向,该资源可能会教我更多关于此类事情的知识?这很有帮助。
  • @coltonoscopy 哪个特定部分?
  • 特别是,不关闭标准输出可能会导致不允许 condor_execute 中的文件生成。
  • 当数据写入文件时,操作系统通常会在写入数据之前缓冲数据,因此它的大小便于磁盘在告诉磁盘写入之前进行物理写入。当缓冲区溢出、文件关闭或手动“刷新”时写入数据......在 CPython 文件对象中,当它们超出范围(它们的引用计数达到 0)时会立即关闭 - 这并非所有实现的情况蟒蛇。因此,如果您的文件保持活动状态,从未关闭且从未刷新,并且从未有足够的数据,那么它将保持空白。
  • 很有用的知识;感谢您花时间解释!难怪开放如此普遍。
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 2017-11-07
  • 2019-12-01
  • 2021-03-27
  • 2015-01-29
  • 1970-01-01
  • 2012-04-18
  • 2014-05-24
相关资源
最近更新 更多