[python] MANIFEST.in이 “python setup.py install”에서 무시 됨-설치된 데이터 파일이 없습니까?
코드가 아닌 항목이 제거 된 내 제거 된 setup.py 스크립트는 다음과 같습니다.
#!/usr/bin/env python
from distutils.core import setup
from whyteboard.misc import meta
setup(
name = 'Whyteboard',
version = meta.version,
packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],
py_modules = ['whyteboard'],
scripts = ['whyteboard.py'],
)
MANIFEST.in :
include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png
“python setup.py install sdist”를 실행하면 “whyteboard-0.41″루트 폴더가있는 멋진 .tar.gz와 locale / images / 및 whyteboard-help / 폴더가 내부에 있습니다. 여기에는 whyteboard 소스 패키지 내부에서 내 프로그램을 시작하는 whyteboard.py 스크립트도 있습니다.
그래서:
whyteboard/
├── locale/
├── images
├── whyteboard-help/
├── whyteboard/
│ ├── __init__.py
│ └── other packages etc
├── whyteboard.py
├── README
├── setup.py
└── CHANGELOG
이것은 내 프로그램의 소스를 반영하고 모든 것이 올바른 방법입니다.
그러나 “python setup.py install”을 실행하면 데이터 파일이 작성되지 않습니다. “whyteboard”소스 패키지 만 작성되고 whyteboard.py는 /usr/local/lib/python2.6/dist-packages/에 있습니다. .
이상적으로는 .tar.gz 파일에서 생성 된 것과 동일한 디렉토리 구조를 dist-packages에서 생성하고 싶습니다. 이것이 내 프로그램이 리소스를 찾을 것으로 예상하는 방식이기 때문입니다.
이 디렉토리 구조를 만들기 위해 “설치”를하려면 어떻게해야합니까? 내가 알 수있는 한 내 매니페스트 파일을 무시하는 것 같습니다.
답변
Ned의 답변 (핵심 문제에 해당)에 추가 된 몇 가지 메모 :
Distutils는 프로젝트 별 하위 디렉토리 site-packages
(또는 dist-packages
Debian / Ubuntu)에 Python 패키지 및 모듈을 설치하지 않습니다. 보시다시피에 직접 설치됩니다 site-packages
. 따라서 whyteboard-xx
sdist 의 포함 디렉토리는 최종 설치된 양식에 존재하지 않습니다.
이것의 한 가지 의미는 data_files
파일 / 디렉터리가 site-packages
포함 된 whyteboard
디렉터리가 아닌 전역 디렉터리에 직접 설치되기 때문에 해당 파일 / 디렉터리가 속한 프로젝트를 명확히하는 방식으로 이름을 지정하는 데주의해야한다는 것 입니다.
또는 대신 패키지 의 데이터 package_data
를 만들 수 있습니다 whyteboard
(즉, 패키지 내부에 있어야 함, 즉 옆에 있어야 함 __init__.py
). 그러면 문제가되지 않습니다.
마지막으로, .NET에 whyteboard.py
모듈 py_modules
과 whyteboard/__init__.py
패키지를 모두 포함하는 것은 의미가 없습니다 packages
. 둘은 상호 배타적이며 둘 다 whyteboard.py
있는 경우 동일한 이름의 패키지를 선호하는 가져 오기에서 모듈이 무시됩니다.
이 whyteboard.py
스크립트이고 가져올 의도가없는 경우 스크립트 옵션을 사용 하고에서 제거해야합니다 py_modules
.
답변
MANIFEST.in
소스 배포에 포함 할 파일을 Distutils에 알려 주지만 설치된 파일에 직접적인 영향을주지는 않습니다. 이를 위해서는 setup.py
일반적으로 패키지 데이터 또는 추가 파일 로 적절한 파일을 파일에 포함해야 합니다 .
답변
내 이유를 알아낼 수 없었다 MANIFEST.in
내가 실행할 때 파일이 무시되고 있었다 python setup.py install
– 밝혀 include_package_data=True
문제로 해결할 수있는 문제입니다. 이 package_data
옵션은 실제로 필요하지 않습니다.
답변
setuptools를 사용해야합니다.
#!/usr/bin/env python
from setuptools import setup, find_packages
from whyteboard.misc import meta
setup(
name = 'Whyteboard',
version = meta.version,
packages = find_packages(),
include_package_data=True,
py_modules = ['whyteboard'],
scripts = ['whyteboard.py'],
)
이것은 실제로 MANIFEST 파일을 사용하여 작업을 수행하는 것이 아니라 필요한 모든 파일을 포함합니다.
답변
Mac OSX에서 python 2.6.1을 실행하면 setup.py 에서 data_files 매개 변수를 사용하는 것 외에는 전혀 운이 없었습니다 . MANIFEST.in을 사용하는 모든 것은 dist 패키지에 파일이 포함되었지만 설치되지는 않았습니다. 다른 패키지를 확인한 결과 실제로 추가 파일을 지정하기 위해 data_files를 사용하고있었습니다.
디렉토리 트리의 모든 파일을 열거하는 데 도움이되는 짧은 함수를 만들었습니다.
(target_dir, [file list]) data_files가 예상하는 형식 :
def gen_data_files(*dirs):
results = []
for src_dir in dirs:
for root,dirs,files in os.walk(src_dir):
results.append((root, map(lambda f:root + "/" + f, files)))
return results
이제 설정 호출에서 이것을 호출 할 수 있습니다.
setup(... data_files = gen_data_files("docs", "lib") ...
그리고 그 나무의 모든 것이 설치됩니다.
답변
최소 게시 실행 가능 예제
- https://github.com/cirosantilli/python-sample-package-with-data
- https://pypi.org/project/python-sample-package-with-data
핵심 요점 : MANIFEST.in
나 에게만 효과가 있었지만 package_data
그렇지 않았습니다.
Ubuntu 19.10, Python 3.7.5, wheel == 0.32.3, setuptools == 41.1.0, twine == 3.1.1에서 테스트되었습니다.
최종 사용자가 https://pypi.org/project/python-sample-package-with-data/ 에서 패키지를 사용하는 방법 :
python3 -m pip install --user python-sample-package-with-data
python-sample-package-with-data
예상 출력 :
hello data
관리자가 게시하는 방법 :
# One time setup.
python3 -m pip install --user setuptools wheel twine
# Every time you want to publish.
python setup.py sdist bdist_wheel
twine upload dist/*
rm -rf build dist *.egg-info
실제 파일 :
MANIFEST.in
# Or else pip install cannot find README.md on the setup.py under certain conditions.
include README.md
# This actually adds the data file.
include python_sample_package_with_data/mydata.txt
python-sample-package-with-data
#!/usr/bin/env python3
import python_sample_package_with_data
print(python_sample_package_with_data.get_data(), end='')
python_sample_package_with_data / __ init__.py
try:
import importlib.resources as importlib_resources
except ImportError:
# In PY<3.7 fall-back to backported `importlib_resources`.
import importlib_resources
def get_data():
return importlib_resources.read_text(__name__, 'mydata.txt')
python_sample_package_with_data / mydata.txt
hello data
setup.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from setuptools import setup, find_packages
from os import path
this_directory = path.abspath(path.dirname(__file__))
with open(path.join(this_directory, 'README.md')) as f:
long_description = f.read()
setup(
name='python-sample-package-with-data',
version='0.0.3',
description='My short description',
long_description=long_description,
long_description_content_type='text/markdown',
url='https://github.com/cirosantilli/python-sample-package-with-data',
author='Ciro Santilli',
author_email='ciro.santilli.contact@gmail.com',
packages=find_packages(),
include_package_data=True,
scripts=['python-sample-package-with-data'],
)
서지: