programing

패키지에서 setup.py (setuptools)에 정의된 버전을 가져오려면 어떻게 해야 합니까?

linuxpc 2023. 6. 5. 23:41
반응형

패키지에서 setup.py (setuptools)에 정의된 버전을 가져오려면 어떻게 해야 합니까?

정된버어전얻수있습까니에 정의된 버전을 수 ?setup.py소포에서 (용)--version또는 다른 목적)?

이미 설치된 배포판의 버전 문자열 조회

런타임에 패키지 내부에서 버전을 검색하려면 다음을 사용할 수 있습니다.

import pkg_resources  # part of setuptools
version = pkg_resources.require("MyProject")[0].version

설치 중에 사용할 버전 문자열 저장

가고 (여기 ) 문자열을 의 내용을 .setup.py.

.py 라는 이름의 version.py 를 수 .__version__line을.py 에서 setup.py 에서 .execfile('mypackage/version.py')그것이 자리잡게__version__setup.py 네임스페이스에 있습니다.

설치 중 레이스 상태에 대한 경고

그런데 여기 다른 답변에서 제안한 것처럼 setup.py 에서 패키지를 가져오지 마십시오. 패키지의 종속성이 이미 설치되어 있기 때문에 사용자에게 효과가 있는 것처럼 보이지만 패키지의 새로운 사용자가 먼저 종속성을 수동으로 설치하지 않으면 패키지를 설치할 수 없기 때문에 패키지를 처음 사용하는 사용자에게 큰 피해를 줄 수 있습니다.

연구: 예제연:mymodule

다음 구성을 상상해 보십시오.

setup.py
mymodule/
        / __init__.py
        / version.py
        / myclasses.py

을 가지고 있는 일반적인 시나리오를 상상해 보세요.setup.py다음과 같은 모양:

setup(...
    install_requires=['dep1','dep2', ...]
    ...)

예를 들면 그고예들어를리,,__init__.py:

from mymodule.myclasses import *
from mymodule.version import __version__

예를 리고예들면를그,면▁for들,myclasses.py:

# these are not installed on your system.
# importing mymodule.myclasses would give ImportError
import dep1
import dep2

문#1: 가져오기 »mymodule 중에

만약 당신이setup.pymymodule그러면 설정 에 다음 메시지가 표시될 수 있습니다.ImportError패키지에 종속성이 있을 때 이는 매우 일반적인 오류입니다.패키지에 기본 제공되는 것 외에 다른 종속성이 없는 경우 안전할 수 있지만 이 방법은 권장되지 않습니다.그 이유는 미래에 대비할 수 없기 때문입니다. 내일 코드가 다른 종속성을 사용해야 한다고 가정해 보십시오.

문제 #2: 내가 어디에 있습니까?__version__?

하드코드하는 경우__version__setup.py모듈에 포함된 버전과 일치하지 않을 수 있습니다.일관성을 유지하기 위해 한 곳에 두고 필요할 때 같은 장소에서 읽습니다.용사를 합니다.import1 문제가 할 수 .

결책해: 아아아setuptools

다음의 조합을 사용할 수 있습니다.open,exec그리고 받아쓰기를 제공합니다.exec변수를 추가하는 방법:

# setup.py
from setuptools import setup, find_packages
from distutils.util import convert_path

main_ns = {}
ver_path = convert_path('mymodule/version.py')
with open(ver_path) as ver_file:
    exec(ver_file.read(), main_ns)

setup(...,
    version=main_ns['__version__'],
    ...)

그고리에서.mymodule/version.py버전 노출:

__version__ = 'some.semantic.version'

이렇게 하면 버전이 모듈과 함께 제공되며, 아직 설치되지 않은 종속성이 있는 모듈을 가져오려고 시도하는 동안 문제가 발생하지 않습니다.

가장 좋은 기술은 다음을 정의하는 것입니다.__version__제품 코드에서 setup.py 으로 가져옵니다.이렇게 하면 실행 중인 모듈에서 읽을 수 있는 값을 얻을 수 있으며 정의할 수 있는 위치는 한 곳뿐입니다.

setup.py 의 값이 설치되어 있지 않으며 설치 후 setup.py 이 유지되지 않습니다.

취재에서 제가 한 일(예를 들어).py:

# coverage/__init__.py
__version__ = "3.2"


# setup.py
from coverage import __version__

setup(
    name = 'coverage',
    version = __version__,
    ...
    )

업데이트(2017): 적용 범위.py는 더 이상 버전을 가져오기 위해 자체를 가져오지 않습니다.사용자 고유의 코드를 가져오면 제품 코드가 아직 설치되지 않은 종속성을 가져오려고 하기 때문에 해당 종속성을 제거할 수 없게 될 수 있습니다. setup.py 이 종속성을 설치하기 때문입니다.

당신의 질문은 조금 모호하지만, 당신이 묻고 있는 것은 그것을 어떻게 명시하는 것이라고 생각합니다.

의 니다있습을 정의할 수 .__version__ 예:

__version__ = '1.4.4'

...아니면 그냥 집어넣어요.setup.py다음과 같이:


import setuptools

setuptools.setup(
    name='foobar',
    version='1.4.4',
)

그들은 이 ...을 할 수 .그리고 그들은 당신이 확인할 수 있는 것은setup.py방금 지정한 버전에 대해 알고 있습니다.

% ./setup.py --version
1.4.4

이 대답들이 마음에 들지 않았습니다...셋업 도구를 요구하거나 단일 변수에 대한 전체 모듈을 별도로 만들고 싶지 않았기 때문에 저는 이것들을 고안했습니다.

메인 모듈이 pep8 스타일로 되어 있고 그 상태를 유지할 것이라고 확신하는 경우:

version = '0.30.unknown'
with file('mypkg/mymod.py') as f:
    for line in f:
        if line.startswith('__version__'):
            _, _, version = line.replace("'", '').split()
            break

특히 주의하여 실제 파서를 사용하려면 다음과 같이 하십시오.

import ast
version = '0.30.unknown2'
with file('mypkg/mymod.py') as f:
    for line in f:
        if line.startswith('__version__'):
            version = ast.parse(line).body[0].value.s
            break

setup.py 은 다소 일회용 모듈이기 때문에 조금 추해도 문제가 되지 않습니다.


정도로 몇년 업이트정: 데을로최몇근년동안이다라는 별도의 했습니다.meta.py저는 자주 바꾸고 싶은 메타데이터를 많이 넣었습니다.그래서, 하나의 가치만을 위한 것이 아닙니다.

다음과 같은 구조를 가진 경우:

setup.py
mymodule/
        / __init__.py
        / version.py
        / myclasses.py

여기서 version.py 에는 다음이 포함됩니다.

__version__ = 'version_string'

설정에서 이 작업을 수행할 수 있습니다.py:

import sys

sys.path[0:0] = ['mymodule']

from version import __version__

이렇게 하면 mymodule/_init_.py에 있는 종속성에 문제가 발생하지 않습니다.

다른 많은 답변들은 구식입니다. 설치된 python 3.10 패키지에서 버전 정보를 가져오는 표준 방법은 PEP-0566의 importlib.metadata를 사용하는 것이라고 생각합니다.

공식 문서: https://docs.python.org/3.10/library/importlib.metadata.html

from importlib.metadata import version
VERSION_NUM = version("InstalledPackageName")

이것은 간단하고 깨끗하며 야단법석을 떨지 않습니다.

패키지 설치 중에 실행되는 스크립트에서 이상한 작업을 수행하는 경우에는 이 작업이 작동하지 않지만 CLI --help 명령, 정보 상자를 통해 사용자를 표시하기 위한 버전 확인용 버전 번호를 가져오는 것이 전부라면,또는 패키지가 이미 설치되어 있고 설치된 버전 번호만 필요한 다른 모든 것은 나에게 가장 좋은 해결책인 것 같습니다.

의 패키지에 .pypackagery__init__.py그러나 PJ 에비가 이미 지적한 바와 같이 타사 종속성을 가지고 있기 때문에 그럴 수 없었습니다(레이스 상태에 대한 그의 답변과 경고 참조).

의 모듈을 했습니다.pypackagery_meta.py메타 정보만 포함합니다.

"""Define meta information about pypackagery package."""

__title__ = 'pypackagery'
__description__ = ('Package a subset of a monorepo and '
                   'determine the dependent packages.')
__url__ = 'https://github.com/Parquery/pypackagery'
__version__ = '1.0.0'
__author__ = 'Marko Ristin'
__author_email__ = 'marko.ristin@gmail.com'
__license__ = 'MIT'
__copyright__ = 'Copyright 2018 Parquery AG'

메타 정보를 그런 정다메가습 다왔니져로 가져왔습니다.packagery/__init__.py:

# ...

from pypackagery_meta import __title__, __description__, __url__, \
    __version__, __author__, __author_email__, \
    __license__, __copyright__

# ...

그리고 마침내 그것을 사용했습니다.setup.py:

import pypackagery_meta

setup(
    name=pypackagery_meta.__title__,
    version=pypackagery_meta.__version__,
    description=pypackagery_meta.__description__,
    long_description=long_description,
    url=pypackagery_meta.__url__,
    author=pypackagery_meta.__author__,
    author_email=pypackagery_meta.__author_email__,
    # ...
    py_modules=['packagery', 'pypackagery_meta'],
 )

다음을 포함해야 합니다.pypackagery_meta당신의 소포에.py_modulessetup 배포판에패키지 배포판이 .그렇지 않으면 패키지 배포판에 부족하기 때문에 설치 시 가져올 수 없습니다.

소스 트리에 파일(예: basedir/yourpackage/_version.py)을 만듭니다. 해당 파일에 다음과 같은 코드가 한 줄만 포함되도록 합니다.

__version__ = "1.1.0-r4704"

그런 다음 setup.py 에서 해당 파일을 열고 다음과 같이 버전 번호를 구문 분석합니다.

verstr = "continue"시도:verstrline = package/_version.py', "rt")를 엽니다. 읽기환경 오류 제외:
pass # 좋아요, 버전 파일이 없습니다.
기타:VSRE = r"^__version__ = [\"]([^'\"]*)['\"]"mo = re.search(VSRE, verstrline, re).M)mo인 경우:verstr = mo.group(1)기타:
raise RuntimeError("패키지에서 버전을 찾을 수 없음/_version.py")

마막으로에서.yourbasedir/yourpackage/__init__.py thisimport _version 파일:

__version__ = "잘못된"시도:원본 _version 가져오기 __version__가져오기 오류 제외:
우리는 _version.py가 없는 트리에서 실행되고 있기 때문에 우리의 버전이 무엇인지 알 수 없습니다.
통과하다

이를 수행하는 코드의 예로는 제가 관리하는 "pyutil" 패키지가 있습니다.(PyPI 또는 Google 검색 참조 -- 스택 오버플로는 이 답변에 하이퍼링크를 포함할 수 없도록 허용하지 않습니다.)

@pjeby는 당신이 그것의 setup.py 에서 당신의 패키지를 가져와서는 안된다는 것이 옳습니다.은 당신이 파이썬 인터프리터를 .py 을 실행하여 때입니다: 새을로 Python setup.py 여할작니때합다동테스트.python setup.py안 될 수도 있어요.ㅠㅠㅠimport youpackage"당신의 패키지"라는 이름의 디렉터리에 대한 현재 작업 디렉터리를 읽는 것이 아니라 현재를 찾는 것을 의미합니다.sys.modules열쇠 "당신의 패키지"를 위해 그리고 그것이 없다면 다양한 것들을 하기 위해.그래서 그것은 항상 당신이 할 때 작동합니다.python setup.py왜냐하면 당신은 신선하고 공허하기 때문입니다.sys.modules하지만 이것은 일반적으로 작동하지 않습니다.

예를 들어, py2exe가 응용프로그램을 패키징하는 프로세스의 일부로 setup.py 을 실행하고 있다면 어떻게 됩니까?저는 패키지가 버전 번호를 받기 때문에 py2exe가 패키지에 잘못된 버전 번호를 입력하는 이런 경우를 본 적이 있습니다.import myownthingrun.py 에서 적이 . setup.py 에서는 py2exe 파일을 참조할 수 있습니다.마찬가지로 setuptools, easy_install, distributils2가 사용자의 패키지에 따라 다른 패키지를 설치하는 프로세스의 일부로 패키지를 빌드하려고 하면 어떻게 됩니까?그런 다음 setup.py 이 평가되는 시점에 패키지를 가져올 수 있는지, 아니면 이 Python 인터프리터의 수명 동안 가져온 패키지 버전이 이미 있는지, 또는 패키지를 가져올 때 다른 패키지를 먼저 설치해야 하는지 또는 부작용이 있는지 여부가 결과를 변경할 수 있습니다.Python 패키지를 재사용하는 데 몇 번 어려움을 겪었는데, Python 패키지는 py2exe 및 setup tools와 같은 도구에 문제가 있었습니다. setup.py 이 버전 번호를 찾기 위해 패키지 자체를 가져오기 때문입니다.

그나저나, 이 기술은 자동으로 생성되는 도구와 잘 어울립니다.yourpackage/_version.py예를 들어, 수정기호 제어 기록을 읽고 수정기호 제어 기록의 가장 최근 태그를 기준으로 버전 번호를 작성하는 등의 방법으로 파일을 작성할 수 있습니다.darcs: http://tahoe-lafs.org/trac/darcsver/browser/trunk/README.rst 와 git: http://github.com/warner/python-ecdsa/blob/0ed702a9d4057ecf33eea969b8cf280eaccd89a1/setup.py#L34 에서 동일한 작업을 수행하는 코드 조각이 있습니다.

또한 정규식을 사용하고 메타데이터 필드에 따라 다음과 같은 형식을 사용할 수 있습니다.

__fieldname__ = 'value'

설치를 시작할 때 다음을 사용합니다.py:

import re
main_py = open('yourmodule.py').read()
metadata = dict(re.findall("__([a-z]+)__ = '([^']+)'", main_py))

그런 다음 스크립트에서 메타데이터를 다음과 같이 사용할 수 있습니다.

print 'Author is:', metadata['author']
print 'Version is:', metadata['version']

단하고직로파만듭다니일을선라는 을 만듭니다.source/package_name/version.py다음 내용을 포함합니다.

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
__version__ = "2.6.9"

다음 당신의 에 당의파일이 있습니다.source/package_name/__init__.py다른 사용자가 사용할 버전을 가져옵니다.

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from .version import __version__

이제 이걸 입으실 수 있습니다.setup.py

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys

try:
    filepath = 'source/package_name/version.py'
    version_file = open( filepath )
    __version__ ,= re.findall( '__version__ = "(.*)"', version_file.read() )

except Exception as error:
    __version__ = "0.0.1"
    sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )

finally:
    version_file.close()

Python Python을 했습니다.2.7,3.3,3.4,3.5,3.6그리고.3.7리눅스, 윈도우즈 및 Mac OS 서 할 다 니 있 습 수 사 에 용 ▁linux이 모든 플랫폼에 대한 통합 및 유닛 테스트가 포함된 패키지를 사용했습니다.에서 결과를 확인할 수 있습니다..travis.yml그리고.appveyor.yml 여기:

  1. https://travis-ci.org/evandrocoan/debugtools/builds/527110800
  2. https://ci.appveyor.com/project/evandrocoan/pythondebugtools/builds/24245446

대체 버전에서 컨텍스트 관리자를 사용하고 있습니다.

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys

try:
    filepath = 'source/package_name/version.py'

    with open( filepath ) as file:
        __version__ ,= re.findall( '__version__ = "(.*)"', file.read() )

except Exception as error:
    __version__ = "0.0.1"
    sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )

사할수있다니습도를 .codecsPython Python에서 입니다.2.7그리고.3.6

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys
import codecs

try:
    filepath = 'source/package_name/version.py'

    with codecs.open( filepath, 'r', errors='ignore' ) as file:
        __version__ ,= re.findall( '__version__ = "(.*)"', file.read() )

except Exception as error:
    __version__ = "0.0.1"
    sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )

Python C Extensions를 사용하여 Python 모듈을 C/C++로 100% 작성하는 경우 동일한 작업을 수행할 수 있지만 Python 대신 C/C++을 사용합니다.

경우에는 과 같이 합니다.setup.py:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
import sys
import codecs
from setuptools import setup, Extension

try:
    filepath = 'source/version.h'

    with codecs.open( filepath, 'r', errors='ignore' ) as file:
        __version__ ,= re.findall( '__version__ = "(.*)"', file.read() )

except Exception as error:
    __version__ = "0.0.1"
    sys.stderr.write( "Warning: Could not open '%s' due %s\n" % ( filepath, error ) )

setup(
        name = 'package_name',
        version = __version__,

        package_data = {
                '': [ '**.txt', '**.md', '**.py', '**.h', '**.hpp', '**.c', '**.cpp' ],
            },

        ext_modules = [
            Extension(
                name = 'package_name',
                sources = [
                    'source/file.cpp',
                ],
                include_dirs = ['source'],
            )
        ],
    )

은 파일에서 .version.h:

const char* __version__ = "1.0.12";

그러나 다음을 생성하는 것을 잊지 마십시오.MANIFEST.in함하여를 version.h파일 이름:

include README.md
include LICENSE.txt

recursive-include source *.h

또한 다음과 같은 기능을 통해 메인 애플리케이션에 통합됩니다.

#include <Python.h>
#include "version.h"

// create the module
PyMODINIT_FUNC PyInit_package_name(void)
{
    PyObject* thismodule;
    ...

    // https://docs.python.org/3/c-api/arg.html#c.Py_BuildValue
    PyObject_SetAttrString( thismodule, "__version__", Py_BuildValue( "s", __version__ ) );

    ...
}

참조:

  1. python 파일 열기 오류
  2. C API에서 Python 모듈에 글로벌 정의
  3. 설치 도구/배포와 함께 패키지 데이터를 포함하는 방법은 무엇입니까?
  4. https://github.com/lark-parser/lark/blob/master/setup.py#L4
  5. 이름이 같은 setuptools 패키지와 ext_modules를 사용하는 방법은 무엇입니까?
  6. distutils(setup.py )를 패키지 데이터의 일부로 사용하는 하위 디렉터리를 포함할 수 있습니까?

(하지 않기 분석하고 파일을 복구할 수 .version구문 트리의 속성:

# assuming 'path' holds the path to the file

import ast

with open(path, 'rU') as file:
    t = compile(file.read(), path, 'exec', ast.PyCF_ONLY_AST)
    for node in (n for n in t.body if isinstance(n, ast.Assign)):
        if len(node.targets) == 1:
            name = node.targets[0]
            if isinstance(name, ast.Name) and \
                    name.id in ('__version__', '__version_info__', 'VERSION'):
                v = node.value
                if isinstance(v, ast.Str):
                    version = v.s
                    break
                if isinstance(v, ast.Tuple):
                    r = []
                    for e in v.elts:
                        if isinstance(e, ast.Str):
                            r.append(e.s)
                        elif isinstance(e, ast.Num):
                            r.append(str(e.n))
                    version = '.'.join(r)
                    break

는 이코는다찾합니다고으려을음을 합니다.__version__또는VERSION모듈 반환의 최상위 수준에서 할당은 문자열 값입니다.오른쪽은 문자열 또는 튜플일 수 있습니다.

고양이 가죽을 벗기는 데는 천 가지 방법이 있습니다. 여기 제 방법이 있습니다.

# Copied from (and hacked):
# https://github.com/pypa/virtualenv/blob/develop/setup.py#L42
def get_version(filename):
    import os
    import re

    here = os.path.dirname(os.path.abspath(__file__))
    f = open(os.path.join(here, filename))
    version_file = f.read()
    f.close()
    version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
                              version_file, re.M)
    if version_match:
        return version_match.group(1)
    raise RuntimeError("Unable to find version string.")

@gringo-suave에서 https://stackoverflow.com/a/12413800 정리:

from itertools import ifilter
from os import path
from ast import parse

with open(path.join('package_name', '__init__.py')) as f:
    __version__ = parse(next(ifilter(lambda line: line.startswith('__version__'),
                                     f))).body[0].value.s

이제 이것은 역겹고 정제가 필요합니다(제가 놓친 pkg_resources에서 발견되지 않은 멤버 통화가 있을 수도 있습니다). 하지만 저는 왜 이것이 작동하지 않는지, 또는 왜 아무도 그것을 현재까지 제안하지 않았는지 이해할 수 없습니다(검색해보니 이것이 발견되지 않았습니다).이것은 Python 2.x이며 pkg_resources가 필요합니다(사이).

import pkg_resources

version_string = None
try:
    if pkg_resources.working_set is not None:
        disto_obj = pkg_resources.working_set.by_key.get('<my pkg name>', None)
        # (I like adding ", None" to gets)
        if disto_obj is not None:
            version_string = disto_obj.version
except Exception:
    # Do something
    pass

서버에 패키지 배포 및 인덱스 패키지에 대한 파일 명명 규칙:

pip 동적 버전 변환의 예:

  • 우승:

    • test_pkg-1.0.0-cp36-cp36m-win_cp64.와글와글
    • test_pkg-1.0.0-py3.6-win-px64.1987
  • mac:

    • test_pkg-1.0.0-py3.7-10.12-x86_64.1987
    • test_pkg-1.0.0-py3.7-10.12-x86_64.와글와글
  • Linux:
    • test_pkg-1.0.0-cp36-cp36m-linux_x86_64.와글와글
from setuptools_scm import get_version

def _get_version():

     dev_version = str(".".join(map(str, str(get_version()).split("+")[0]\
            .split('.')[:-1])))

    return dev_version

git commit에서 dynamic pip version matching 샘플 setup.py 을 찾습니다.

setup(
    version=_get_version(),
    name=NAME,
    description=DESCRIPTION,
    long_description=LONG_DESCRIPTION,
    classifiers=CLASSIFIERS,

# add few more for wheel wheel package ...conversion

)

저는 우리 프로젝트 중 하나의 필요에 따라 이 문제를 해결하기 위해 get version을 작성했습니다.일련의 PEP 호환 전략을 사용하여 모듈 버전을 반환하고 개발 모드(gitscm)에 대한 몇 가지 전략을 추가합니다.

예:

from getversion import get_module_version

# Get the version of an imported module
from xml import dom
version, details = get_module_version(dom)
print(version)

수확량

3.7.3.final.0

이 버전이 발견된 이유는 무엇입니까?당신은 그것을 이해할 수 있습니다.details:

> print(details)
Version '3.7.3.final.0' found for module 'xml.dom' by strategy 'get_builtin_module_version', after the following failed attempts:
 - Attempts for module 'xml.dom':
   - <get_module_version_attr>: module 'xml.dom' has no attribute '__version__'
 - Attempts for module 'xml':
   - <get_module_version_attr>: module 'xml' has no attribute '__version__'
   - <get_version_using_pkgresources>: Invalid version number: None
   - <get_builtin_module_version>: SUCCESS: 3.7.3.final.0

자세한 내용은 설명서에서 확인할 수 있습니다.

저는 아래와 같은 환경변수를 사용하고 있습니다.

VERSION=0.0.0 python setup.py sdist bdist_wheel

설치 중.파이의


import os

setup(
    version=os.environ['VERSION'],
    ...
)

패커 버전과의 일관성 확인을 위해 아래 스크립트를 사용하고 있습니다.

PKG_VERSION=`python -c "import pkg; print(pkg.__version__)"`
if [ $PKG_VERSION == $VERSION ]; then
    python setup.py sdist bdist_wheel
else
    echo "Package version differs from set env variable"
fi

setup setup.cfg에서 .?:[\s]+|[\s])?[=](?:[\s]+|[\s])?(.*)

import re
with open("setup.cfg", "r") as _file:
    data = _file.read()
print(re.findall(r"\nversion(?:[\s]+|[\s])?[=](?:[\s]+|[\s])?(.*)", data))
# -> ['1.1.0']

은 이 를 당신의 이코를수있다에 할 수 .__init__.py:

VERSION = (0, 3, 0)


def get_version():
    """Return the VERSION as a string.
    For example, if `VERSION == (0, 10, 7)`, return '0.10.7'.
    """
    return ".".join(map(str, VERSION))


__version__ = get_version()

그리고 이것을 추가합니다.setup.py:

def get_version(version_tuple):
    """Return the version tuple as a string, e.g. for (0, 10, 7),
    return '0.10.7'.
    """
    return ".".join(map(str, version_tuple))


init = os.path.join(os.path.dirname(__file__), "your_library", "__init__.py")
version_line = list(filter(lambda line: line.startswith("VERSION"), open(init)))[0]
VERSION = get_version(eval(version_line.split("=")[-1]))

그리고 마지막으로, 다음을 추가할 수 있습니다.version=VERSION,에줄대다을에 setup:

setup(
    name="your_library",
    version=VERSION,
)

저는 다음과 같은 방법으로 이 문제를 해결했습니다.

내 모듈 내에 version.py 을 만들었습니다.

setup.py

mymodule/
    / __init__.py
    / version.py
    / myclasses.py

판본파이의

__version__ = '1.0.0'

setup.py

import sys
    
sys.path.insert(0, ("./mymodule"))

from version import __version__

저는 이런 식으로 의존을 피했습니다.물론, 저는 여기서 많은 대답에 영감을 받았습니다.

감사해요!

언급URL : https://stackoverflow.com/questions/2058802/how-can-i-get-the-version-defined-in-setup-py-setuptools-in-my-package

반응형