如何使用任意路径将Python模块导入局部变量?

时间:2016-12-15 04:44:17

标签: python

我试图将python文件用作配置文件。在我的真实程序中,我让用户在命令行中指定配置文件。

这是我的榜样:

some_randomly_named_file.py

import os
from datetime import timedelta

PROJECT = "my project"
ENABLED_FORMATS = ['xml', 'json', 'yaml']
EXPIRATION=3600

#DEBUG = True
#TESTING = False

LOG_FOLDER = os.path.join(os.path.expanduser('~'), 'logs')

该文件存储在此处:/foo/bar/baz/some_randomly_named_file.py

...然后在myapp.py

# parse the command line and get the path
path_to_file = '/foo/bar/baz/some_randomly_named_file.py'

# load the python file at path_to_file into local variable myconfig
# [What do I write here to accomplish this?]

# And now we have a local variable called myconfig
print(myconfig.PROJECT)

输出:

my project

3 个答案:

答案 0 :(得分:1)

尝试将您的路径添加到sys.path

例如:如果您的配置文件是myconfig.py并且存在于/ foo / bar / baz下。

import sys
sys.path.append("/foo/bar/baz/")
import myconfig
local_var = myconfig.PROJECT

您可以使用 os.path.basename() os.path.dirname()来检索用户输入的值。

从User

获取配置文件名和目录路径的示例程序

test.py

import sys
import os

file_path = sys.argv[1]
dir_name = os.path.dirname(file_path)
file_name = os.path.basename(file_path)

sys.path.append(dir_name)
print dir_name
print file_name

输出

#python test.py /var/log/syslog
/var/log
syslog

答案 1 :(得分:1)

像@sandeep提到的那样。只需将源文件(config.py)添加到sys路径即可。将此config.py文件添加到路径中时,Python将文件(及其内容)视为普通模块。这是一个更多的解释:

# Load your config.py as a module
import sys
sys.path.append("/foo/bar/baz/") # Path to config.py parent folder

import config # Import as a regular module

print(config.PROJECT)
"my project"

您可以使用this very similar question作为参考。

答案 2 :(得分:0)

我根据this SO article中@Redlegjed的答案找到了解决方案。

这里稍作修改:

import os
import importlib.machinery

path_to_file = '/foo/bar/baz/some_randomly_named_file.py'

module_dir, module_file = os.path.split(path_to_file)
module_name, module_ext = os.path.splitext(module_file)

x = importlib.machinery.SourceFileLoader(module_name, path_to_file).load_module()

print(myconfig.PROJECT)

相关且有用的文章列表:

How to import a module given the full path?

Python 3.4: How to import a module given the full path?

Import arbitrary python source file. (Python 3.3+)