Python - IOError: [Errno 2] No such file or directory: u'lastid.py' for file in same directory. Works locally, doesn't on Heroku
Python - IOError: [Errno 2] No such file or directory: u'lastid.py' for file in same directory. Works locally, doesn't on Heroku
我怀疑这是一个非常新手的问题,但我找不到任何有用的解决方案:(
我一直在尝试通过构建一个简单的 Twitter 机器人来开始使用 Python,该机器人可以回复发推文的人。它在本地有效,但在 Heroku 上无效。
简要说明:每次机器人发推文时,它都会使用一个名为 mainscript.py 的脚本,该脚本将回复的最后一条推文的 ID 写入一个名为 lastid.py 的单独文件中。脚本下次运行时,它会打开 lastid.py,根据当前推文列表检查其中的数字,并且只响应 ID 号大于 lastid.py.[=12 中存储的 ID 号的那些=]
fp = open("lastid.py", 'r')
last_id_replied = fp.read()
fp.close()
#(snipped - the bot selects the tweet and sends it here...)
fp = open("lastid.py", 'w')
fp.write(str(status.id))
fp.close()
这在本地效果很好。运行良好。但是,当我将它上传到 Heroku 时,出现此错误:
Traceback (most recent call last):
File "/app/workspace/mainscript.py", line 60, in <module>
fp = open("lastid.py", 'r')
IOError: [Errno 2] No such file or directory: u'lastid.py'
我绝对 100% 肯定 lastid.py 和 mainscript.py 在服务器上并且在同一目录中 - 我已经通过 运行 bash 对这一点进行了三次检查英雄库。我的 .gitignore 文件是空白的,所以与此无关。
我不明白为什么 'open a file in the same directory and read it' 这样简单的命令在服务器上不起作用。我究竟做错了什么?
(我意识到我应该在尝试用一种新语言构建自定义内容之前完成一些教程,但现在我已经开始了这个我真的很想完成它 - 任何人可以提供的任何帮助都会非常有用非常感谢。)
可能 python 解释器是从与您的脚本所在的目录不同的目录中执行的。
这是相同的设置:
oliver@aldebaran /tmp/junk $ cat test.txt
a
b
c
baseoliver@aldebaran /tmp/junk $ cat sto.py
with open('test.txt', 'r') as f:
for line in f:
print(line)
baseoliver@aldebaran /tmp/junk $ python sto.py
a
b
c
baseoliver@aldebaran /tmp/junk $ cd ..
baseoliver@aldebaran /tmp $ python ./junk/sto.py
Traceback (most recent call last):
File "./junk/sto.py", line 1, in <module>
with open('test.txt', 'r') as f:
IOError: [Errno 2] No such file or directory: 'test.txt'
要解决此问题,请导入 os 并使用绝对路径名:
import os
MYDIR = os.path.dirname(__file__)
with open(os.path.join(MYDIR, 'test.txt')) as f:
pass
# and so on
我怀疑这是一个非常新手的问题,但我找不到任何有用的解决方案:( 我一直在尝试通过构建一个简单的 Twitter 机器人来开始使用 Python,该机器人可以回复发推文的人。它在本地有效,但在 Heroku 上无效。
简要说明:每次机器人发推文时,它都会使用一个名为 mainscript.py 的脚本,该脚本将回复的最后一条推文的 ID 写入一个名为 lastid.py 的单独文件中。脚本下次运行时,它会打开 lastid.py,根据当前推文列表检查其中的数字,并且只响应 ID 号大于 lastid.py.[=12 中存储的 ID 号的那些=]
fp = open("lastid.py", 'r')
last_id_replied = fp.read()
fp.close()
#(snipped - the bot selects the tweet and sends it here...)
fp = open("lastid.py", 'w')
fp.write(str(status.id))
fp.close()
这在本地效果很好。运行良好。但是,当我将它上传到 Heroku 时,出现此错误:
Traceback (most recent call last):
File "/app/workspace/mainscript.py", line 60, in <module>
fp = open("lastid.py", 'r')
IOError: [Errno 2] No such file or directory: u'lastid.py'
我绝对 100% 肯定 lastid.py 和 mainscript.py 在服务器上并且在同一目录中 - 我已经通过 运行 bash 对这一点进行了三次检查英雄库。我的 .gitignore 文件是空白的,所以与此无关。
我不明白为什么 'open a file in the same directory and read it' 这样简单的命令在服务器上不起作用。我究竟做错了什么?
(我意识到我应该在尝试用一种新语言构建自定义内容之前完成一些教程,但现在我已经开始了这个我真的很想完成它 - 任何人可以提供的任何帮助都会非常有用非常感谢。)
可能 python 解释器是从与您的脚本所在的目录不同的目录中执行的。
这是相同的设置:
oliver@aldebaran /tmp/junk $ cat test.txt
a
b
c
baseoliver@aldebaran /tmp/junk $ cat sto.py
with open('test.txt', 'r') as f:
for line in f:
print(line)
baseoliver@aldebaran /tmp/junk $ python sto.py
a
b
c
baseoliver@aldebaran /tmp/junk $ cd ..
baseoliver@aldebaran /tmp $ python ./junk/sto.py
Traceback (most recent call last):
File "./junk/sto.py", line 1, in <module>
with open('test.txt', 'r') as f:
IOError: [Errno 2] No such file or directory: 'test.txt'
要解决此问题,请导入 os 并使用绝对路径名:
import os
MYDIR = os.path.dirname(__file__)
with open(os.path.join(MYDIR, 'test.txt')) as f:
pass
# and so on