Anaconda 包问题:内部模块找不到位于同一目录中的数据文件

Anaconda Package issue: An internal module cannot find a data file located in the same directory

我正在使用 anaconda conda 包框架构建一个 python 3.6 包。 该包似乎在源文件方面运行良好。没有 构建错误等。但是,我正在尝试在我存储的地方添加新功能 包中的一些小 CSV 数据文件。我想使用 pandas

加载数据

我 运行 遇到的问题是我似乎无法引用亲戚 从包内正确的文件路径。如果我是,那么代码就可以工作 也就是说,当我在包裹中时,Jupyter 笔记本无法使用。这 路径问题似乎是问题出现的方式,但我怀疑它有 更多与如何在包中处理内部寻址有关。

错误信息是:

 FileNotFoundError: File b'data.csv' does not exist

此错误的奇怪之处在于 data.csv 文件与试图访问它的 python 文件位于同一目录中。所以我不明白为什么下面的 python 模块 reader.py 似乎找不到这个文件。

所以让我给出一个包结构和代码的最小示例。

/project
   /docs
   /packaging
       /conda_build_files
           bld.bat
           build.sh
           meta.yaml
   /src
       /data
           __init__.py
           reader.py
           data.csv   #PROBLEM AREA     
       __init__.py
       module1.py
   setup.py
   README.rst

所以问题是文件reader.py使用pandas读取csv文件 进入数据框。 Module1 然后调用 reader 来获取数据。

所以代码设置如下:

##reader.py

import pandas as pd
class Reader():

    def read():
    return pd.read_csv('data.csv')

然后在 module1 中我的代码为:

##module1.py

from .data.reader import Reader
import pandas as pd

def main():
    dat = Reader.read()
    print(dat.head())

所以这是我得到关于 data.csv 不存在的奇怪错误的地方。现在 在这种情况下,我什至不需要相对导入,因为 Reader class 和 data.csv 文件位于同一文件夹中。是的,出于某种原因我明白了 奇怪的错误信息。

data.csv 文件包含在 MANIFEST.in 文件中。

我的 setup.py 看起来像这样。

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

setup(
    name='pkg',
    version='0.6.0',
    description="desc",
    long_description=readme + '\n\n' + history,
    author="me",
    author_email='me',
    url='https://github.com/.../pkg',
    packages=[
        'pkg',
    ],
    package_dir={'pkg':
                 'pyugend'},
    package_data={
      'mydata': ['pkg/data/*.csv'],
   },
    include_package_data=True,
    install_requires=requirements,
    license="ISCL",
    zip_safe=False,
    keywords='pkg',
    classifiers=[
        'Development Status :: 2 - Pre-Alpha',
        'Programming Language :: Python :: 3.6',
    ],
    test_suite='tests',
    tests_require=test_requirements
)

meta.yaml 文件也很普通:

package:
  name: pkg
  version: "0.6"

source:
   git_url: https://github....

build:
  # noarch_python: True
  # preserve_egg_dir: True
  entry_points:


requirements:
  build:
    - python


  run:
    - python
    - numpy
    - pandas
    - docopt
    - matplotlib

about:

  license: MIT License

尽管存在 reader.py,但您创建的 Python 的实例在您启动的本地目录中 运行。换句话说,如果您在 C:\Users\krishnab 中打开 CMD 提示符(或终端)并启动 Python,则 Python 实例的基本位置为 C:\Users\krishnab

当调用 pd.read_csv('data.csv') 时,Python 在当前工作目录中查找 data.csv,在本例中为 C:\Users\krishnab


您可以在 /data 下添加一个额外的空 python 文件。它只会用于获取 data.csv.

的目录
/src
    /data
        __init__.py
        reader.py
        data.csv 
        other.py

other.py有内容:

# other.py
pass

reader.py中你可以导入other并使用__file__属性来获取路径。

reader.py的内容:

from . import other
import pandas as pd
import os
data_dir = os.path.dirname(os.path.abspath(other.__file__))

class Reader:
    def read(self):
        return pd.read_csv(data_dir+'/data.csv')