【问题标题】:Why would Python's sys.stdout.write() not work after I index a list obtained from a file object using os.popen?为什么在我使用 os.popen 索引从文件对象获得的列表后,Python 的 sys.stdout.write() 不起作用?
【发布时间】:2014-01-16 21:20:53
【问题描述】:

更新更新问题: 我有一个 JQuery $.ajax 调用,如下所示:

$.ajax({
    url: 'http://website.domain.gov/cgi-bin/myFolder/script.py',
    type: 'post',
    dataType: 'json',
    data:{'lat':'30.5', 'lon':'-80.2'},
    success: function(response){alert(response.data.lat);
                                otherFunction();}
});

在 script.py 中,它自己运行没有错误,我执行以下操作:

#!/usr/bin/python
import sys, json, cgi
import os

fs = cgi.FieldStorage()

d = {}
for k in fs.keys():
    d[k] = fs.getvalue(k)

ilat = d['lat']
ilon = d['lon']
pntstr = ilat + ',' + ilon
my_list = []

#os.chdir('..'); os.chdir('..')
#os.chdir('a_place/where_data/exists')

# If you'd like to run this code, you probably don't have grib files or 'degrib', so another unix command will have to be utilized to open some sort of dummy data

f = os.popen('degrib '+'datafilename '+
             'options '+ pntstr)

out = f.read()

# data has 5 columns, many rows
j = 0
while j < (5*num_lines_to_read):
    my_list.append(out[j+4])
    j += 5

f.close()

#os.chdir('..')  etc until I get back to /cgi-bin/myFolder directory...

x = my_list[0]

result = {}
result['data'] = d
sys.stdout.write('Content-Type: application/json\n\n')
sys.stdout.write(json.dumps(result))
sys.stdout.close()

注意:'d' 是虚拟值,与 'my_list' 无关...暂时

当我更新正在开发的网页并尝试从 Python 返回“d”(以警报的形式)时,我收到“非常有用”的服务器 500 错误。

我已将问题缩小到“x = my_list[0]”行。如果我改为输入“x = my_list”,则不会出现错误。当我尝试索引“my_list”时,sys.stdout.write() only 停止工作。我尝试打印列表。它不是空的,并且包含具有预期类型的​​预期值。如果我将它放在 之前 "x = my_list[0]",我会从 sys.stdout.write() 获得成功的输出。问题是,我最终将使用“my_list”来创建写入标准输出的输出。

我在这里遗漏了一些晦涩的文件 I/O 吗?

【问题讨论】:

  • -1 “不起作用”不是对软件相关问题的描述。如果您正在寻找算命先生,这里有很多,但 Stackoverflow 上没有。如果你想在你的情况下得到帮助,你应该首先描述:你得到了什么输出,你期望什么?
  • 正如我上面所说,我网页上的预期输出是一个“虚拟值”,“d”(以 Javascript 警报的形式)。相反,我在 Chrome 错误控制台中收到服务器 500 错误。因此,我被引导相信某些东西导致 sys.stdout.write() “不起作用”。既然您要查找的内容已向您指出,您还有什么需要回答的问题吗?

标签: python ajax file-io


【解决方案1】:

表达式my_list[0] 正在引发异常。要么不是list,要么不支持数组运算符。

尝试检查您的网络服务器日志文件。在发出内容类型标头后尝试打印type(my_list)len(my_list)

【讨论】:

  • 嗯 type(my_list) 给了我 并且 len(my_list) 给了我 145。列表元素是字符串,就像我想要的那样。我必须等到明天才能查看服务器日志文件。老板不允许我这样做。谢谢!
  • 另外,我在没有 sys.std.write () 的情况下运行了 Python 代码,没有出现任何错误。然后索引 my_list 不会产生错误。很奇怪。
  • 新理论。您在... more unrelated code ... 中抛出异常。尝试将脚本缩小到仍然显示错误的最小程序。
  • 我将“stdout”代码块移动到整个脚本中,并将其缩小到那一行。我试过'x = my_list','stdout'块工作正常。警报在我的网页上弹出了预期的输出。只是当我执行 'x = my_list[0]' 时它不起作用。此时我可能会尝试围绕它进行编程。也许有些线路在文件输入/输出中交叉,这会混淆 Ajax 进程?这发生在我使用 stdout = subprocess.PIPE 之前,这就是为什么我将所有内容都更改为 os.popen...
  • 好的,根据您分享的有限信息,您已经得到了我的最佳猜测。我建议您创建演示问题的最短程序,并将该程序复制粘贴到您的问题中。请参阅stackoverflow.com/help/mcve 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2019-12-31
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多