Python代码没有';在我用setuptools打包并用pip安装之后,我看不到数据文件

Python代码没有';在我用setuptools打包并用pip安装之后,我看不到数据文件,python,setuptools,setup.py,Python,Setuptools,Setup.py,我已经用setuptools打包了一些python代码。代码使用数据文件,但在安装带有pip的软件包后,代码找不到数据文件。我做错了什么 下面是文件结构和文件内容。可以找到这些文件。python代码setup.py正在尝试使用mesa/a.txt数据文件。如果我不打包+pip它,代码就可以正常工作 | |- tm/ | |- __init__.py | |- test2.py |- mesa/ | |- __init__.py | |- a.txt |- MANIFEST.in |-

我已经用
setuptools
打包了一些python代码。代码使用数据文件,但在安装带有
pip
的软件包后,代码找不到数据文件。我做错了什么


下面是文件结构和文件内容。可以找到这些文件。python代码
setup.py
正在尝试使用
mesa/a.txt
数据文件。如果我不打包+pip它,代码就可以正常工作

|
|- tm/
|  |- __init__.py
|  |- test2.py
|- mesa/
|  |- __init__.py
|  |- a.txt
|- MANIFEST.in
|- setup.py
清单。在
中:

include mesa/a.txt
setup.py

from setuptools import setup
setup(name='bobab',
      version='0.1',
      py_modules=['tm.test2'],
      author_email='x@gmail.com',
      package_data = {
        'tm': ['mesa/a.txt']
        },
    )
import os

def main():
    print 'hi' 
    print open(os.path.join('..', 'mesa', 'a.txt'), 'r').read() # print file content

if __name__ == "__main__":
    main()
'mesa/a.txt

hello world!
tm/test2.py

from setuptools import setup
setup(name='bobab',
      version='0.1',
      py_modules=['tm.test2'],
      author_email='x@gmail.com',
      package_data = {
        'tm': ['mesa/a.txt']
        },
    )
import os

def main():
    print 'hi' 
    print open(os.path.join('..', 'mesa', 'a.txt'), 'r').read() # print file content

if __name__ == "__main__":
    main()

我使用命令
python setup.py sdist
创建包。我使用以下命令安装软件包:

unzip bobab-0.1.zip
cd bobab-0.1
python setup.py install
软件包没有看到数据文件
mesa/a.txt
,如下面的错误消息所示:

Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
>>> import tm.test2
>>> tm.test2.main()
hi
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tm/test2.py", line 5, in main
    print open(os.path.join('..', 'mesa', 'a.txt'), 'r').read()
IOError: [Errno 2] No such file or directory: '../mesa/a.txt'
安装日志:

(sedona) dernonco@ilcompn0:/mnt/ilcompn0d1/user/dernonco/temp/bobab-0.1$ python setup.py install
running install
running bdist_egg
running egg_info
writing bobab.egg-info/PKG-INFO
writing top-level names to bobab.egg-info/top_level.txt
writing dependency_links to bobab.egg-info/dependency_links.txt
reading manifest file 'bobab.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'bobab.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-x86_64/egg
running install_lib
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/tm
copying tm/__init__.py -> build/lib.linux-x86_64-2.7/tm
copying tm/test2.py -> build/lib.linux-x86_64-2.7/tm
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/egg
creating build/bdist.linux-x86_64/egg/tm
copying build/lib.linux-x86_64-2.7/tm/__init__.py -> build/bdist.linux-x86_64/egg/tm
copying build/lib.linux-x86_64-2.7/tm/test2.py -> build/bdist.linux-x86_64/egg/tm
byte-compiling build/bdist.linux-x86_64/egg/tm/__init__.py to __init__.pyc
byte-compiling build/bdist.linux-x86_64/egg/tm/test2.py to test2.pyc
creating build/bdist.linux-x86_64/egg/EGG-INFO
copying bobab.egg-info/PKG-INFO -> build/bdist.linux-x86_64/egg/EGG-INFO
copying bobab.egg-info/SOURCES.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying bobab.egg-info/dependency_links.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
copying bobab.egg-info/pbr.json -> build/bdist.linux-x86_64/egg/EGG-INFO
copying bobab.egg-info/top_level.txt -> build/bdist.linux-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/bobab-0.1-py2.7.egg' and adding 'build/bdist.linux-x86_64/egg' to it
removing 'build/bdist.linux-x86_64/egg' (and everything under it)
Processing bobab-0.1-py2.7.egg
Copying bobab-0.1-py2.7.egg to /mnt/ilcompn0d1/user/dernonco/pyenv/sedona/lib/python2.7/site-packages
Adding bobab 0.1 to easy-install.pth file

Installed /mnt/ilcompn0d1/user/dernonco/pyenv/sedona/lib/python2.7/site-packages/bobab-0.1-py2.7.egg
Processing dependencies for bobab==0.1
Finished processing dependencies for bobab==0.1

有几件事需要调整:

  • MANIFEST.in
    将仅在打包源区时使用,因此即使使用当前设置,
    python setup.py sdist
    也将包含
    mesa/a.txt
    。二进制发行版不是这种情况,无论是
    bdist\u egg
    还是
    bdist\u wheel
    都不会读取
    清单
  • package_data
    通常用于放置在包中的非python文件,但是
    mesa
    未放置在
    tm
    目录中,因此相对路径错误。可以通过设置虚线路径来避免此问题:

    package_data={'tm': ['../mesa/a.txt']}
    
    但是,如果
    mesa
    tm
    包的一部分,那么将其放在它所属的位置是有意义的

  • os.path.join(“..”、“mesa”、“a.txt”)
    将解析相对于当前目录的路径,因此只有当您位于
    tm
    目录中时,这一行才能找到该文件-安装软件包后,情况几乎不会如此。您需要正确解析路径,例如针对
    \uuuu file\uuu
    属性:

    os.path.join(os.path.dirname(__file__), '..', 'mesa', 'a.txt')
    
  • 补充说明:

  • 您可以安全地将
    py_模块=['tm.test2']
    替换为
    packages=['tm']
    ,在向
    tm
    包添加更多模块时,无需关心更新
    py_模块
  • setuptools
    提供了一个名为
    pkg\u resources
    的模块,该模块为通过
    package\u data
    安装的非python文件提供了有用的管理功能。比如说,

    open(os.path.join('..', 'mesa', 'a.txt'), 'r').read()
    
    可以用

    pkg_resources.resource_string('tm', '../mesa/a.txt')
    
    如果您想了解更多信息,请参阅
    设置工具
    文档中的章节


  • 当我处理调用不同文件夹中其他文件的文件时,我在文件顶部使用此代码

    from os.path import dirname, join, abspath
    sys.path.insert(0, abspath(join(dirname(__file__), '..')))
    
    然后

    from file_name import value 
    

    非常感谢您的详细回答!这解决了我的问题,提高了我对如何使用
    setuptools
    的理解。很高兴我能提供帮助!