另一个Python脚本执行的Python脚本中的路径已更改

时间:2016-06-16 21:46:20

标签: python python-2.7 subprocess

$apiheaders = array( 'WM_SVC.NAME: Walmart Marketplace', 'WM_QOS.CORRELATION_ID: 1466113345', 'WM_SEC.TIMESTAMP:1466113345447', 'WM_SEC.AUTH_SIGNATURE: XXXXXXXXXXX' 'WM_CONSUMER.ID: XXXXXXXXXXX', 'Content-Type: application/xml', 'Accept: application/xml', ); $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPHEADER, $apiheaders); curl_setopt($curl, CURLOPT_URL,$return_api_host); curl_setopt($curl, CURLOPT_VERBOSE, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); $response = curl_exec($curl); curl_close($curl); 处的脚本尝试使用/foo/bar.py模块运行第二个脚本/main.py。虽然subprocess在Windows命令提示符下与main.py运行良好,但运行调用python main.py的{​​{1}}会导致错误

bar.py

为什么main.py的路径出现问题,我们如何解决?

〜/的Settings.ini

ConfigParser.NoSectionError: No section: 'user'

〜/富/ bar.py

settings.ini

〜/ main.py

[user]
id: helloworld

2 个答案:

答案 0 :(得分:1)

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

<强> main.py

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

答案 1 :(得分:0)

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

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

如果您想将数据存储在与已安装的Python模块打包在一起的文件中,那么您可以使用pkgutil.get_data()pkg_resources.resource_string() work even if your package is inside an archiveput get_script_dir() function into your script。不建议手动构建路径,但如果您需要包含当前脚本的目录,则可以Python : How to access file from different directory - 它比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)

请参阅https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-cordova-get-started-users/