Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
参考python包中的文件_Python_Path_Subprocess - Fatal编程技术网

参考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=

我想在PyPI上发布一个python包,它有一个调用可执行文件的类的方法

该软件包的结构如下:

/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,因为我知道我用你的提示解决的相对路径。