我有类似的结构
src/
setup.py
my_folder/
my_script.py
my_data.json
我的.py
文件使用来自my_data.json
的数据,它简单地用路径my_data.json
指向它,因为它就在它旁边?是的,当我用python my_script.py
正常运行它时,它可以正常工作,但当我试图通过安装文件创建它并用一些别名运行它时——它显然是从/src
目录运行的,它看不到我的my_data.json
文件,因为它应该指向my_folder/my_data.json
。当我打印os.getcwd()
时,我看到my_script.py
是从/src
目录运行的,这有点奇怪。。。我的设置如下:
setup(
name='main',
entry_points={
'console_scripts': [
'my_alias = my_folder.my_script:main'
],
},
include_package_data=True,
packages=find_packages()
)
你知道如何强制在他的目录而不是安装程序所在的目录中运行我的脚本吗?
如果可以避免的话,我强烈建议您避免移动到packages目录,但类似于:
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
可能会起作用。
如果您只需要获取包含在模块中的资源,您可以在myscript中执行以下操作:
import json
import pkg_resources
raw = pkg_resources.resource_string(__name__, 'my_data.json')
data = json.loads(raw)
pkg_resources.resource_string以字节字符串的形式返回my_data.json的内容。如果您希望能够将.resource_stream和.resource_filename方法分别作为python中的文件或使用子进程打开,那么它们也是可用的。这为您提供了与zip_safe环境的兼容性,根据您所做的工作,这些环境可能对您有用,也可能不有用。
我不确定它在技术上是否需要,但我发现有时设置脚本在自动将数据文件添加到包中时效果不佳,需要一些手动干预,如以下操作:
setup(
name='mypackage',
entry_points={
'console_scripts': [
'my_alias = mypackage.my_script:main'
],
},
package_data={'mypackage': ['*.json']}, # Important addition
include_package_data=True,
packages=find_packages()
)