引用文件

时间:2016-04-03 13:56:54

标签: python-2.7 python-import python-module

现在我通过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'

1 个答案:

答案 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