我正在尝试从父目录导入文件,到目前为止没有运气:
.
├── e.py
├── __init__.py
├── q.py
└── subproject
├── __init__.py
├── sfile.py
以下是sfile.py
import sys, os
topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
os.pardir, os.pardir))
if os.path.exists(os.path.join(topdir, "project", "__init__.py")):
sys.path.insert(0, topdir)
from project import e
它给了我一个错误:
Traceback (most recent call last):
File "sfile.py", line 8, in <module>
from project import e
ImportError: No module named project
但是,如果我去python解释器并做同样的事情,那就可以了:
>>> import os, sys
>>> topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir))
>>> if os.path.exists(os.path.join(topdir, "project", "__init__.py")):
... sys.path.insert(0, topdir)
...
>>> from project import e
IN e
>>>
这是我的e.py
文件:
print "IN e"
sergey@sergey-PC:~/tmp/project/subproject$ ls
__init__.py __init__.pyc sfile.py sfile.pyc www.py www.pyc
sergey@sergey-PC:~/tmp/project/subproject$ pwd
/home/sergey/tmp/project/subproject
sergey@sergey-PC:~/tmp/project/subproject$ python
Python 2.7.3 (default, Apr 10 2013, 05:13:16)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.abspath(os.curdir)
'/home/sergey/tmp/project/subproject'
>>>
以下是尝试执行from .. import e
Traceback (most recent call last):
File "sfile.py", line 3, in <module>
from .. import e
ValueError: Attempted relative import in non-package
sys.argv[0]
:
在翻译中:
>>> import sys
>>> sys.argv[0]
''
>>>
在文件顶部添加print sys.argv[0]
时:
sergey@sergey-PC:~/tmp/project/subproject$ python sfile.py
sfile.py
sys.argv[0]
sergey@sergey-PC:~/tmp/project/subproject$ python sfile.py
/home/sergey/tmp/project/subproject/sfile.py
interpeter:
>>> import os
>>> os.path.abspath(sys.argv[0])
'/home/sergey/tmp/project/subproject'
>>>
答案 0 :(得分:1)
你需要另一个os.pardir才能工作,因为第一个只是从文件跳转到同一个文件夹(由于你已经在文件夹中,因此不会在文件夹中发生):
topdir = os.path.normpath ( os.path.join (os.path.abspath(sys.argv[0]),
os.pardir, os.pardir, os.pardir) )
当然,这是多余和烦人的。怎么样:
dirs = [ os.path.abspath(sys.argv[0]) ] + [os.pardir] * 3
topdir = reduce(lambda x, y: os.path.join(x, y), dirs)
根据嵌套文件的级别更改更容易(只需更改幻数3或甚至使其动态化)。