【问题标题】:Python setup runs scripts in his own directoryPython setup 在他自己的目录中运行脚本
【发布时间】:2020-07-10 05:51:36
【问题描述】:

我有这样的结构

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

你知道如何强制在他的目录而不是放置设置的目录中运行我的脚本吗?

【问题讨论】:

  • 尝试将'my_alias = my_folder.my_script:main'添加到'my_alias = ../my_folder.my_script:main'
  • 嗯,它的语法不正确,我认为它不会那样工作,因为在这种情况下它指向错误的目录

标签: python installation directory setup.py entry-point


【解决方案1】:

如果可以避免的话,我强烈建议避免进入包目录,但类似:

import os

os.chdir(os.path.dirname(os.path.abspath(__file__)))

可能会起作用。

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

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 的内容。如果您希望能够分别在 python 中或使用子进程将它们作为文件打开,还有 .resource_stream 和 .resource_filename 方法。这为您提供了与 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()
)

【讨论】:

  • 答案非常相似。现在我必须去我所有的“主要”/脚本并更改使用的路径。虽然做的服务很少,这可能取决于某种文件,但我认为这不是我想要做的。我想在不影响其逻辑的情况下运行这些服务。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多