为什么服务器上 Python 文件中的 f.write() 不起作用?
Why does f.write() in a Python file on a server not work?
我有一个 Python 应用程序可以在本地运行,但在服务器上出现问题。
所以我必须在 SSH 会话中进行一些调试。
服务器日志告诉我 utils/do_something.py
出现问题。
我已经创建了 utils/log
(权利 777),调试值应该放在那里。
do_something.py
看起来像这样:
import os
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
def do_something(arg1, arg2):
print('XXX')
f = open(log_file, 'a')
f.write('XXX\n')
stuff = goes.wrong
加载页面导致 do_something
到 运行(错误日志已确认)。在本地,预期的 XXX 出现在控制台和日志文件中。但是服务器上没有任何反应。
我创建了第二个文件 utils/blah.py
:
print('BLAH')
import os
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
f = open(log_file, 'a')
f.write('BLAH\n')
当我 运行 它与 python blah.py
时,预期的 BLAH 出现在控制台和日志文件中。
我不太关心本地服务器和生产服务器之间的区别。
但我想了解 do_something.py
和 blah.py
之间的区别。
在 SSH 会话中是否有更好的调试方法?
我在 Webfaction 服务器上的 mod_wsgi 4.6.5/Python3.7
环境中的 virtualenv 中工作。
关于它的一些细节可以在 Webfaction 论坛上的 this question 中看到。
编辑 1: 在服务器上 print
似乎无论如何都不鼓励。
(参见 Where do things go when I ‘print’ them from my Django app?)
但对我来说重要的是 f.write()
。我刚刚添加了 print
进行比较。
Edit 2: 我用logging模块也是这样。它在我 运行 blah.py
时有效,但在加载页面 运行s do_something
.
时没有任何反应
编辑 3: 我用一个更简单的应用程序尝试了同样的方法,结果是一样的。
我在 views.py
中添加了登录:
from django.http import HttpResponse
import os
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
def home_view(request):
f = open(log_file, 'a')
f.write('XXX\n')
return HttpResponse("Hello from home view.")
每次加载页面时,本地都会将 XXX 写入日志文件。但服务器上没有。
服务器日志中没有错误。
使用 logging
模块: 我不确定为什么它不起作用,但现在它起作用了。
import os
import logging
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
logging.basicConfig(filename=log_file, level=logging.DEBUG)
logging.debug('This works.')
可能我用的是 filename='log'
而不是 filename=log_file
。
在本地,前者在根文件夹中创建日志文件。但是在服务器上它必须已经存在。
写作权:看来值得一提的是touch log
给了我一个我写不出来的文件,缺少sudo
我无法使用chmod
。所以我使用了技巧 install -b -m 777 /dev/null log
.
您似乎从未在写入后明确关闭文件,因此输出可能已缓冲。您的服务器和本地计算机在文件缓冲方面可能有不同的设置,这可以解释您遇到的差异。
如果您想打开、写入和关闭文件,python 的上下文管理器是最好的方法:
def home_view(request):
with open(log_file, 'a') as f:
f.write('XXX\n')
return HttpResponse("Hello from home view.")
您可以检查 utils 文件夹和任何父文件夹的权限。很多时候,http 服务器将 运行 作为用户 'nobody',实际上具有 zip 权限。因此,除非 utils 文件夹本身也具有 0777 权限,否则可能会产生问题。您可能还想将 f.write 放在 try ... except 块中,以便您可以专门捕获错误并创建有关错误的更有用/信息丰富的消息。最好的。
我有一个 Python 应用程序可以在本地运行,但在服务器上出现问题。
所以我必须在 SSH 会话中进行一些调试。
服务器日志告诉我 utils/do_something.py
出现问题。
我已经创建了 utils/log
(权利 777),调试值应该放在那里。
do_something.py
看起来像这样:
import os
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
def do_something(arg1, arg2):
print('XXX')
f = open(log_file, 'a')
f.write('XXX\n')
stuff = goes.wrong
加载页面导致 do_something
到 运行(错误日志已确认)。在本地,预期的 XXX 出现在控制台和日志文件中。但是服务器上没有任何反应。
我创建了第二个文件 utils/blah.py
:
print('BLAH')
import os
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
f = open(log_file, 'a')
f.write('BLAH\n')
当我 运行 它与 python blah.py
时,预期的 BLAH 出现在控制台和日志文件中。
我不太关心本地服务器和生产服务器之间的区别。
但我想了解 do_something.py
和 blah.py
之间的区别。
在 SSH 会话中是否有更好的调试方法?
我在 Webfaction 服务器上的 mod_wsgi 4.6.5/Python3.7
环境中的 virtualenv 中工作。
关于它的一些细节可以在 Webfaction 论坛上的 this question 中看到。
编辑 1: 在服务器上 print
似乎无论如何都不鼓励。
(参见 Where do things go when I ‘print’ them from my Django app?)
但对我来说重要的是 f.write()
。我刚刚添加了 print
进行比较。
Edit 2: 我用logging模块也是这样。它在我 运行 blah.py
时有效,但在加载页面 运行s do_something
.
编辑 3: 我用一个更简单的应用程序尝试了同样的方法,结果是一样的。
我在 views.py
中添加了登录:
from django.http import HttpResponse
import os
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
def home_view(request):
f = open(log_file, 'a')
f.write('XXX\n')
return HttpResponse("Hello from home view.")
每次加载页面时,本地都会将 XXX 写入日志文件。但服务器上没有。
服务器日志中没有错误。
使用 logging
模块: 我不确定为什么它不起作用,但现在它起作用了。
import os
import logging
parent_folder = os.path.dirname(__file__)
log_file = os.path.join(parent_folder, 'log')
logging.basicConfig(filename=log_file, level=logging.DEBUG)
logging.debug('This works.')
可能我用的是 filename='log'
而不是 filename=log_file
。
在本地,前者在根文件夹中创建日志文件。但是在服务器上它必须已经存在。
写作权:看来值得一提的是touch log
给了我一个我写不出来的文件,缺少sudo
我无法使用chmod
。所以我使用了技巧 install -b -m 777 /dev/null log
.
您似乎从未在写入后明确关闭文件,因此输出可能已缓冲。您的服务器和本地计算机在文件缓冲方面可能有不同的设置,这可以解释您遇到的差异。
如果您想打开、写入和关闭文件,python 的上下文管理器是最好的方法:
def home_view(request):
with open(log_file, 'a') as f:
f.write('XXX\n')
return HttpResponse("Hello from home view.")
您可以检查 utils 文件夹和任何父文件夹的权限。很多时候,http 服务器将 运行 作为用户 'nobody',实际上具有 zip 权限。因此,除非 utils 文件夹本身也具有 0777 权限,否则可能会产生问题。您可能还想将 f.write 放在 try ... except 块中,以便您可以专门捕获错误并创建有关错误的更有用/信息丰富的消息。最好的。