2013-02-23 81 views
2

我意识到这可能被认为是一些在那里的其他问题重复的问题,但我已经花了一个多小时,现在通过各种网页和文档的阅读,还是不明白,对文件进行操作这里发生了什么。Python-在多个目录

我试图在多个目录中使用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使用。

回答

2

这是一个来自Python程序员的长期问题。问题是Python不能很好地处理包内的脚本。在过去的几个版本中,情况有所改善,但它仍然不会在很多时候做正确的事情。

我认为最好的答案是限制你在哪里运行你的test_some_file.py,并使用Python解释器的-m参数。即更改到myproject之上的目录,然后运行python -m myproject.tests.test_some_file。这是唯一可以在不影响sys.path的情况下工作的方法。

这将允许您的任何一个导入线路正常工作。 PEP 8目前建议始终使用绝对导入,所以第一个版本可能比使用..的相关版本更好。

+0

这帮助了我的第一个问题;是否有第二个问题的原因,some_file.py不能再找到some_data.dat? – Retsam 2013-02-23 07:05:49

+0

@Retsam:你的模块有什么问题? – 2013-02-23 07:40:34

+1

@Retsam:some_file.py可以在os.path.split(__ file __)[0]'目录中找到some_file.dat。 – martineau 2013-02-23 16:35:31

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