Python安装程序在自己的目录中运行脚本

Python安装程序在自己的目录中运行脚本,python,installation,directory,setup.py,entry-point,Python,Installation,Directory,Setup.py,Entry Point,我有这样的结构 src/ setup.py my_folder/ my_script.py my_data.json My.py文件使用来自My_data.json的数据,它用路径My_data.json简单地指向它,因为它紧挨着它?是的,当我通过python my_script.py正常运行它时,它可以正常工作,但当我试图通过安装文件创建它并使用一些别名运行它时,它显然是从/src目录运行的,它看不到我的my_data.json

我有这样的结构

src/
   setup.py
   my_folder/
             my_script.py
             my_data.json
My
.py
文件使用来自
My_data.json
的数据,它用路径
My_data.json
简单地指向它,因为它紧挨着它?是的,当我通过
python my_script.py
正常运行它时,它可以正常工作,但当我试图通过安装文件创建它并使用一些别名运行它时,它显然是从
/src
目录运行的,它看不到我的
my_data.json
文件,因为它应该指向
我的文件夹/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__)))
可能会有用

如果您只需要获取模块中包含的资源,可以在my_脚本中执行以下操作:

import json
import pkg_resources

raw = pkg_resources.resource_string(__name__, 'my_data.json')
data = json.loads(raw)
pkg_resources.resource_字符串以bytestring的形式返回my_data.json的内容。如果您希望能够分别在python中或通过子流程将它们作为文件打开,还可以使用.resource_stream和.resource_filename方法。这使您能够与zip_安全环境兼容,这可能对您有用,也可能对您不有用,这取决于您正在做什么

我不确定这在技术上是否需要,但我发现有时安装脚本无法很好地自动将数据文件添加到包中,需要一些手动干预,如以下所示:

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()
)

尝试添加
'my\u alias=my\u folder.my\u script:main'
'my\u alias=../my\u folder.my\u script:main'
嗯,它的语法不正确,我认为它不会这样工作,因为在这种情况下它指向了错误的目录。答案非常类似。现在,我必须去我所有的“主/脚本”并更改使用的路径。虽然很少做服务,这可能依赖于某种类型的文件,但我认为这不是我想要做的。我希望在不影响其逻辑的情况下运行这些服务。