参考python包中的文件
我想在PyPI上发布一个python包,它有一个调用可执行文件的类的方法 该软件包的结构如下:参考python包中的文件,python,path,subprocess,Python,Path,Subprocess,我想在PyPI上发布一个python包,它有一个调用可执行文件的类的方法 该软件包的结构如下: /project LICENSE MANIFEST.in README.md setup.py /package_name classA.py classB.py executableFile classC.py subprocess.call('./executableFile', shell=
/project
LICENSE
MANIFEST.in
README.md
setup.py
/package_name
classA.py
classB.py
executableFile
classC.py
subprocess.call('./executableFile', shell=True)
from package.classA import classA
obj_instance = classA()
obj_instance.method() #inside this method there is the subprocess.call(...)
在classA.py方法中,我使用子流程
模块调用可执行文件,如下所示:
/project
LICENSE
MANIFEST.in
README.md
setup.py
/package_name
classA.py
classB.py
executableFile
classC.py
subprocess.call('./executableFile', shell=True)
from package.classA import classA
obj_instance = classA()
obj_instance.method() #inside this method there is the subprocess.call(...)
如果我通过virtualenv中的pip
安装包,并且我有一个main.py脚本,使用安装的包,如下所示:
/project
LICENSE
MANIFEST.in
README.md
setup.py
/package_name
classA.py
classB.py
executableFile
classC.py
subprocess.call('./executableFile', shell=True)
from package.classA import classA
obj_instance = classA()
obj_instance.method() #inside this method there is the subprocess.call(...)
程序崩溃并告诉我找不到executableFile。我认为这是因为subprocess.call(…)
搜索main.py文件夹中的可执行文件,而不是包文件夹
如何指定可执行文件的确切路径
我试着用
os.path.dirname(os.path.abspath('executableFile'))
获取包文件夹的名称,但它会返回main.py所在的文件夹路径
我怎样才能解决这个问题
提前感谢。setuptools附带了一个框架,用于处理类似的情况 那里有很多书要读,我不知道有什么好的教程,但基本思想是: 将
executableFile
指定为文件资源<代码>设置工具确定在安装(或车轮制造)时将其粘贴到何处
在运行时,调用resource\u filename
以获取executableFile
的路径,然后调用该路径
您可能还希望atexit
使用cleanup\u resources
功能
在封面下,pkg_resources
将找出所有细节。使用--inplace
它将成为源代码树中的一个文件;通过分解安装,它将成为站点包中的某个文件
;使用egg安装,或者甚至作为由py2exe
等压缩的站点包的一部分,它将是一个按需提取到缓存目录的文件。但你不必为此担心;你只要找到一条路就行了
同时: 我认为这是因为
subprocess.call(…)
搜索main.py文件夹中的可执行文件,而不是包文件夹
它搜索当前的工作目录。这可能与目录main.py
中的目录相同,但前提是用户通过更改到该目录并运行/main.py
或python main.py
或类似目录来运行程序
我试着用
os.path.dirname(os.path.abspath('executableFile'))
这是行不通的,因为abspath
也在搜索当前的工作目录,所以这只是一种更复杂的获取相同错误路径的方法。然后你dirname
that,然后取回工作目录,这是无用的
如果您知道从package.classA.py
到executableFile
的相对路径,您可以通过以下方式找到它:
packagedir = os.path.dirname(os.path.abspath(__file__))
execdir = os.path.join(packagedir, '<that relative path>')
execpath = os.path.join(execdir, 'executableFile')
packagedir=os.path.dirname(os.path.abspath(_文件__))
execdir=os.path.join(packagedir“”)
execpath=os.path.join(execdir,'executableFile')
或者,如果您从main.py
知道相对路径,则可以在main.py
中执行相同的操作,并将路径存储到某个地方以供以后使用(例如,将其传递到classA
构造函数)
但这不是一个理想的解决方案。源目录树中的相对路径可能与安装后的相对路径不同。如果您的用户将您的包安装为egg,或者将您的包与某个应用程序库的其余部分捆绑在一个zipfile中,那么您只需要获得egg或zip的路径,并且在任何位置都找不到与此相关的可执行文件
,因为它只存在于存档中。等等
pkg_resources
的目的是解决所有这些问题,也许还有我没有想到的其他问题,还有一些可能在Python 3.7/pip 10/setuptools 40中不存在,但会在Python 3.8/pip 12/setuptools 45中存在,您的一位用户将在18个月后处理这些问题,因为您早就忘记了这一切是如何工作的……我对您的问题有点困惑,因为您说在main.py文件夹中找不到executableFile,但是.py文件不是文件夹。文件夹结构中也没有main.py文件。您可以始终使用path.dirname(\uuuuu file)
获取文件的父文件夹,并使用path.join(path.dirname(\uuuu file),“executableFile”)
创建正确文件的路径。我已经编辑了问题,我指的是存在main.py脚本的文件夹。其次,当通过pip在virtualenv中安装python包时,需要一个使用包提供的API的文件(main.py)。在这种情况下,如果使用path.dirname(\uuuu file\uuuu)
则会得到main.py的父文件夹,而不是包的父文件夹。我想我没有得到您的答案。您的意思是在PyPI上上载软件包时,将setuptools
与pkg_资源一起使用吗?然后在代码中使用resource\u filename
?@Frank您可以在setup.py
中执行pkg\u resources
设置。它不是作为上传到PyPI的一部分运行的,而是作为安装包或构建轮子的一部分运行的。在代码中,您可以使用resource\u filename
访问您在设置中指定的资源。您确实需要阅读文档(至少是简介和ResourceManager API部分);这里有太多的细节,而且我所知道的没有好的教程,仅仅靠猜测就可以得到。好的@abarnert,因为我知道我用你的提示解决的相对路径。