我们正在使用部署在Windows和Linux上的代码存储库-有时在不同的目录中。项目中的一个模块应该如何引用项目中的一个非python资源(CSV文件等)?

如果我们这样做:

thefile = open('test.csv')

or:

thefile = open('../somedirectory/test.csv')

只有当脚本从一个特定目录或目录的一个子集运行时,它才会工作。

我想做的是:

path = getBasePathOfProject() + '/somedirectory/test.csv'
thefile = open(path)

这可能吗?


当前回答

我被难住了。想把一些资源文件打包到一个轮子文件中并访问它们。使用清单文件打包,但是pip install没有安装它,除非它是一个子目录。希望这些场景照片能有所帮助

├── cnn_client
│   ├── image_preprocessor.py
│   ├── __init__.py
│   ├── resources
│   │   ├── mscoco_complete_label_map.pbtxt
│   │   ├── retinanet_complete_label_map.pbtxt
│   │   └── retinanet_label_map.py
│   ├── tf_client.py

MANIFEST.in

recursive-include cnn_client/resources *

使用标准setup.py创建了一个weel。PIP安装了车轮文件。 安装后检查资源是否安装。他们是

ls /usr/local/lib/python2.7/dist-packages/cnn_client/resources

mscoco_complete_label_map.pbtxt
retinanet_complete_label_map.pbtxt 
 retinanet_label_map.py  

在tfclient.py中访问这些文件。从

templates_dir = os.path.join(os.path.dirname(__file__), 'resources')
 file_path = os.path.join(templates_dir, \
            'mscoco_complete_label_map.pbtxt')
        s = open(file_path, 'r').read()

这很有效。

其他回答

我花了很长时间来思考这个问题的答案,但我最终得到了它(它实际上非常简单):

import sys
import os
sys.path.append(os.getcwd() + '/your/subfolder/of/choice')

# now import whatever other modules you want, both the standard ones,
# as the ones supplied in your subfolders

这将把子文件夹的相对路径附加到供python查找的目录中 它非常快速和肮脏,但它的工作就像一个魅力:)

尝试使用相对于当前文件路径的文件名。'./my_file'示例:

fn = os.path.join(os.path.dirname(__file__), 'my_file')

在Python 3.4+中,你也可以使用pathlib:

fn = pathlib.Path(__file__).parent / 'my_file'

如果你想稍后将脚本编译为.exe,那么__file__不会给你.exe文件的路径。在这种情况下你应该这样做

使用sys.argv [0]

sys。Argv[0]给出了文件的路径,当它是一个。exe文件,当你运行脚本,如python script.py

这就是我目前引用事物的方式

os.path.join (os.path.dirname (os.path.abspath (sys.argv[0])),“资源”)

这里有更详细的解释

如果您正在使用安装工具或分发(setup.py安装),那么访问这些打包资源的“正确”方式似乎是使用package_resources。

对你来说,这个例子就是

import pkg_resources
my_data = pkg_resources.resource_string(__name__, "foo.dat")

当然,是哪个读取了资源,读取的二进制数据是my_data的值

如果你只是需要文件名,你也可以使用

resource_filename(package_or_requirement, resource_name)

例子:

resource_filename("MyPackage","foo.dat")

这样做的好处是,即使它是一个像鸡蛋一样的存档发行版,它也能保证工作。

看到http://packages.python.org/distribute/pkg_resources.html resourcemanager-api

我被难住了。想把一些资源文件打包到一个轮子文件中并访问它们。使用清单文件打包,但是pip install没有安装它,除非它是一个子目录。希望这些场景照片能有所帮助

├── cnn_client
│   ├── image_preprocessor.py
│   ├── __init__.py
│   ├── resources
│   │   ├── mscoco_complete_label_map.pbtxt
│   │   ├── retinanet_complete_label_map.pbtxt
│   │   └── retinanet_label_map.py
│   ├── tf_client.py

MANIFEST.in

recursive-include cnn_client/resources *

使用标准setup.py创建了一个weel。PIP安装了车轮文件。 安装后检查资源是否安装。他们是

ls /usr/local/lib/python2.7/dist-packages/cnn_client/resources

mscoco_complete_label_map.pbtxt
retinanet_complete_label_map.pbtxt 
 retinanet_label_map.py  

在tfclient.py中访问这些文件。从

templates_dir = os.path.join(os.path.dirname(__file__), 'resources')
 file_path = os.path.join(templates_dir, \
            'mscoco_complete_label_map.pbtxt')
        s = open(file_path, 'r').read()

这很有效。