我意识到这可能被认为是其他一些问题的重复问题,但我现在花了一个多小时阅读各种页面和文档,但仍然不明白这里发生了什么。
我正在尝试在多个目录中使用python文件;我基本上有这个:
myproject/
__init__.py
some_file.py
some_data.dat
tests/
__init__.py
test_some_file.py
test_some_file.py
从命令行运行,顾名思义,用于运行some_file.py
中包含的代码,并需要导入它。但是,我似乎无法这样做。
我试过了:
from myproject import some_file
以及
from .. import some_file
我确实设法让它使用sys.path
运行,但根据我所阅读的内容,这似乎不是正确的做法。
其次,当我使用sys.path
确实让它运行时,我收到错误,找不到some_data.dat
使用的some_file.py
。
答案 0 :(得分:2)
这是Python程序员常年提出的问题。问题是Python不能很好地处理包内的脚本。在过去的几个版本中,情况有所改善,但在很多时候它仍然没有做正确的事情。
我认为最好的答案是限制运行test_some_file.py
的位置,并使用Python解释器的-m
参数。也就是说,更改为myproject
上方的目录,然后运行python -m myproject.tests.test_some_file
。这是唯一可以在不弄乱sys.path
的情况下工作的方式。
这将允许您的任一导入行正常工作。 PEP 8目前建议始终使用绝对导入,因此第一个版本可能比使用..
的相对版本更好。
答案 1 :(得分:0)
对于像您这样的情况,我将some_file.py
的目录添加到sys.path
(暂时)。
代码:
import sys, os
dirname = os.path.dirname( # going up by 1 directory
os.path.dirname( # going up by 2 directories
sys.argv[0]))
sys.path.append(dirname)
import some_test