【问题标题】:python relative import error when referencing file引用文件时python相对导入错误
【发布时间】:2016-07-23 00:41:27
【问题描述】:

现在我得到了 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'
)

我得到的错误

当我从 spamfilter 父目录执行 $ python -m spamfilter.run.test 时,我收到此错误。这是回溯。

$ 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'

【问题讨论】:

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


    【解决方案1】:

    编辑: 将os.path.abspath('.') 替换为os.path.abspath(__file__)

    os.path.abspath('.') 在不同文件夹中执行脚本时会给出不同的结果。 .是当前路径,根据哪个路径调用脚本

    原帖

    您需要将您的项目添加到 sys 路径中,并确保您在文件夹 spamfilter 下有 __init__.py

    test.py

    import sys
    sys.path.append("/path/to/spamfilter_app")
    from spamfilter.classifier.train import Trainer
    

    【讨论】:

    • 您现在可以导入Trainer,并将项目路径附加到sys.path吗?
    • 我认为导入现在工作正常,但 lofile.txt 错误仍然存​​在。我已经更新了问题中的错误更改日志。
    • os.path.abspath('.') 取决于您执行的是哪个文件夹`python -m spamfilter.run.test`。当你在不同的道路上时,它会给你不同的结果
    猜你喜欢
    • 2016-06-13
    • 2014-05-21
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多