现在我通过following this获得了相对的导入工作。但是我在使用错误的相对路径引用文件时会遇到一些错误。
我的文件夹结构是这样的
spamfilter_app
├── Makefile
└── spamfilter
├── classifier
│ ├── classifierNB.py
│ ├── exceptions.py
│ ├── __init__.py
│ └── train.py
├── data
│ ├── corpus1
│ ├── corpus2
│ └── corpus3
├── __init__.py
├── logfiles
│ └── logfile.txt
└──run
├── __init__.py
└── test.py
它的绝对路径为/home/tasdik/Desktop/spamfilter_app
我的文件看起来像这样
test.py
from ..classifier.train import Trainer
CUR_DIR = os.path.abspath('.')
PARENT_DIR = os.path.abspath(os.path.join(CUR_DIR, os.path.pardir))
LOGGING_FILE = os.path.join(PARENT_DIR, 'logfiles', 'logfile.txt')
CORPUS_DIR = os.path.join(PARENT_DIR, 'data')
logging.basicConfig(
filename=LOGGING_FILE,
level = logging.DEBUG,
filemode = 'w',
format = '%(asctime)s - %(levelname)s - %(message)s'
)
train.py
from .classifierNB import NaiveBayesClassifier
CUR_DIR = os.path.abspath('.')
PARENT_DIR = os.path.abspath(os.path.join(CUR_DIR, os.path.pardir))
LOGGING_FILE = os.path.join(PARENT_DIR, 'logfiles', 'logfile.txt')
logging.basicConfig(
filename=LOGGING_FILE,
level = logging.DEBUG,
filemode = 'w',
format = '%(asctime)s - %(levelname)s - %(message)s'
)
classifierNB.py
CUR_DIR = os.path.abspath('.')
PARENT_DIR = os.path.abspath(os.path.join(CUR_DIR, os.path.pardir))
LOGGING_FILE = os.path.join(PARENT_DIR, 'logfiles', 'logfile.txt')
logging.basicConfig(
filename=LOGGING_FILE,
level=logging.DEBUG,
filemode='w',
format='%(asctime)s - %(levelname)s - %(message)s'
)
我收到错误
当我从$ python -m spamfilter.run.test
父目录执行spamfilter
时,出现此错误。这是追溯。
$ python -m spamfilter.run.test
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/home/tasdik/Desktop/spamfilter_app/spamfilter/run/test.py", line 18, in <module>
from ..classifier.train import Trainer
File "spamfilter/classifier/train.py", line 27, in <module>
from .classifierNB import NaiveBayesClassifier
File "spamfilter/classifier/classifierNB.py", line 43, in <module>
format='%(asctime)s - %(levelname)s - %(message)s'
File "/usr/lib/python2.7/logging/__init__.py", line 1540, in basicConfig
hdlr = FileHandler(filename, mode)
File "/usr/lib/python2.7/logging/__init__.py", line 911, in __init__
StreamHandler.__init__(self, self._open())
File "/usr/lib/python2.7/logging/__init__.py", line 936, in _open
stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/home/tasdik/Desktop/logfiles/logfile.txt'
logfile.txt
被赋予错误的绝对路径。我试着对logile.txt
的路径进行硬编码,但是当访问语料库目录时我遇到了同样的问题
有人可以解释我哪里出错吗?
修改
根据建议,我通过添加
将项目路径添加到sys
路径
sys.path.append("/home/tasdik/Desktop/spamfilter_bad")
在每个提到的文件中。进口就像
一样from spamfilter.classifier.classifierNB.py import NaiveBayesClassifier
我认为导入发生得很好,但文件logfile error still persists
。
这是更新的错误追溯
$ python -m spamfilter.run.test
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/home/tasdik/Desktop/spamfilter_app/spamfilter/run/test.py", line 22, in <module>
from spamfilter.classifier.train import Trainer
File "spamfilter/classifier/train.py", line 30, in <module>
from spamfilter.classifier.classifierNB.py import NaiveBayesClassifier
File "spamfilter/classifier/classifierNB.py", line 46, in <module>
format='%(asctime)s - %(levelname)s - %(message)s'
File "/usr/lib/python2.7/logging/__init__.py", line 1540, in basicConfig
hdlr = FileHandler(filename, mode)
File "/usr/lib/python2.7/logging/__init__.py", line 911, in __init__
StreamHandler.__init__(self, self._open())
File "/usr/lib/python2.7/logging/__init__.py", line 936, in _open
stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/home/tasdik/Desktop/logfiles/logfile.txt'
答案 0 :(得分:1)
修改强>:
将os.path.abspath('.')
替换为os.path.abspath(__file__)
os.path.abspath('.')
会为您提供不同的结果。 .
是当前路径,它基于哪个路径调用脚本
原帖
您需要将项目添加到sys路径中,并确保文件夹__init__.py
下有spamfilter
test.py
import sys
sys.path.append("/path/to/spamfilter_app")
from spamfilter.classifier.train import Trainer