2017-12-13 18 views
1

anaconda conda 패키지 프레임 워크를 사용하여 python 3.6 패키지를 구축 중입니다. 패키지가 소스 파일과 관련하여 정상적으로 작동하는 것 같습니다. 빌드 오류 등은 없습니다. 그러나 패키지에있는 일부 작은 CSV 데이터 파일을 에 저장하는 새로운 기능을 추가하려고합니다. pandasAnaconda 패키지 문제 : 내부 모듈이 같은 디렉토리에있는 데이터 파일을 찾을 수 없습니다.

내가 실행중인 문제는 패키지 내에서 상대 파일 경로를 올바르게 참조 할 수 없다는 것입니다. 그래서 코드가 인 경우 작동 할 코드는 Jupyter 노트북 안에 들어있을 때 작동하지 않습니다. 경로 문제는 문제 자체가 나타나는 방식 인 것으로 보이지만 내부 주소 지정이 패키지에서 처리되는 방식과 관련하여 과 관련이 있다고 판단됩니다.

오류 메시지는 다음과 같습니다

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

이 오류에 대한 이상한 점은 data.csv 파일에 액세스하려고하는 파이썬 파일과 같은 디렉토리에있는 것입니다. 그래서 왜 파이썬 모듈 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이 dataframe에 csv 파일 을 읽을 수 pandas를 사용한다는 것입니다. Module1reader을 호출하여 데이터를 얻습니다.

그래서 코드가 같은 설정은 다음과 같습니다

다음 모듈 1에서 내가 같은 코드가
##reader.py 

import pandas as pd 
class Reader(): 

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

:

##module1.py 

from .data.reader import Reader 
import pandas as pd 

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

을 내가 존재하지 않는 data.csv에 대한 이상한 오류가 발생하고 어디 그래서이됩니다. 이제 Reader 클래스와 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 파일이 꽤 바닐라 너무 : reader.py이 존재하는 경우에도 불구하고

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 

답변

1

는 사용자가 만든 파이썬의 인스턴스의 경우 시작 로컬 디렉토리에서 실행됩니다. 즉, C:\Users\krishnab에서 CMD 프롬프트 (또는 터미널)를 열고 Python을 시작하면 해당 Python 인스턴스의 기본 위치가 C:\Users\krishnab이됩니다.

pd.read_csv('data.csv')이 호출되면 파이썬은 현재 작업 디렉토리 (C:\Users\krishnab)에서 data.csv을 찾습니다.


/data 아래에 빈 파이썬 파일을 추가 할 수 있습니다. data.csv의 디렉토리를 가져 오는 데만 사용됩니다.

/src 
    /data 
     __init__.py 
     reader.py 
     data.csv 
     other.py 

other.py는 내용이 있습니다 reader.py에서

# other.py 
pass 

당신이 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') 
+0

좋아, 난 당신이 작업 디렉토리에 대해 말하는 것을 얻는다. 그렇다면 데이터 파일이있는 상대 디렉토리를 참조하려면 어떻게해야합니까? 마찬가지로'os' 패키지 나 다른 것을 사용해야합니까? – krishnab

+0

데이터 파일의 경로를 얻는 방법에 대한 추가 정보로 업데이트했습니다. – James

+0

아, 이거 잘 됐네. 도와 주셔서 대단히 감사합니다 @ 제임스. 흥미로운 점은 상대 경로를 사용하기 전에는이 문제가 발생하지 않았지만 이제는 논리를 볼 수 있습니다. 그것은 모두 작동합니다. – krishnab