【问题标题】:Path Changed in Python Script Executed by Another Python Script另一个 Python 脚本执行的 Python 脚本中的路径已更改
【发布时间】:2016-06-16 21:46:19
【问题描述】:

/foo/bar.py 的脚本尝试使用 subprocess 模块运行第二个脚本 /main.py。尽管main.py 在 Windows 命令提示符下使用python main.py 运行良好,但运行调用main.pybar.py 会导致错误

ConfigParser.NoSectionError: No section: 'user'

为什么settings.ini 的路径现在出现问题,我们该如何解决?

~/settings.ini

[user]
id: helloworld

~/foo/bar.py

subprocess.Popen([sys.executable, "../main.py"])

~/main.py

Config = ConfigParser.ConfigParser()
Config.read("settings.ini")
userId = Config.get('user', 'id')

【问题讨论】:

标签: python python-2.7 subprocess


【解决方案1】:

如果假定settings.inimain.py 位于同一目录中,则可以从__file__ 推断其完整路径并使用完整路径读取设置。

ma​​in.py

import os
ini_path = os.path.join(os.path.dirname(__file__), "settings.ini")
Config = ConfigParser.ConfigParser()
Config.read(ini_path)

【讨论】:

    【解决方案2】:

    检查read() 方法是否返回非空列表,否则意味着找不到settings.ini。相对路径是相对于当前工作目录(运行 python 的位置)而非脚本目录(存储 bar.py 的位置)解析的。

    您可能应该使用appdirs.user_config_dir() 来获取放置用户配置文件的目录。不同的操作系统,如 Windows、macOS、Linux 发行版可能使用不同的默认值。 appdirs 遵循适用于给定操作系统的约定。

    如果您想获取存储在与您安装的 Python 模块一起打包的文件中的数据,那么您可以使用 pkgutil.get_data() 或 setuptools 的 pkg_resources.resource_string()work even if your package is inside an archive。不建议手动构建路径,但如果您需要包含当前脚本的目录,那么您可以put get_script_dir() function into your script——它比os.path.dirname(os.path.abspath(__file__)) 更通用。如果相对位置始终相同,则可以使用:

    #!/usr/bin/env python
    import os
    import subprocess
    import sys
    
    main_script_dir = os.path.join(get_script_dir(), os.pardir)
    subprocess.check_call([sys.executable, '-m', 'main'], cwd=main_script_dir)
    

    Python : How to access file from different directory

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多