我有个问题,需要很长时间来解释,所以我要把它分解成有趣的部分。我试着用kconfiglib.py解析一些kconfig。这是我的代码(ofconfig.in
)
[intro_code]
source "b.in"
我的代码正在做它应该在[简介代码]。我不确定
source
是否是python关键字,但它是关于输入/包含不同的文件(这里的名称是b.in
,与执行的脚本位于同一文件夹中)错误消息:现在运行脚本时,将显示以下错误消息:
IOError: config.in:51: sourced file "b.in" (expands to
"b.in") not found. Perhaps base_dir
(argument to Config.__init__(), currently
"$srctree") is set to the wrong value.
我要解决的问题是:我试图将工作目录更改为
Sourcecodes
(这是config.in
和b.in
所在的位置)在config.in
之上:os.chdir("/home/fedor/Sourcecodes")
retval = os.getcwd()
print "Directory changed successfully %s" % retval
在执行过程中,它返回:
目录更改成功/home/fedor/Sourcecodes
所以目录看起来没问题,但无论如何都会出现相同的错误消息。
它在以下情况下工作:使用绝对路径
b.in
(比如source "/home/fedor/Sourcecodes/b.in")
,然后它就工作了,但这不是我可以使用脚本的方式。有人知道如何告诉python在与执行的脚本相同的目录中查找吗?
[编辑:]如所愿,完整代码:
我打电话给
python /home/fedor/Sourcecodes/Kconfiglib/examples/print_tree.py /home/fedor/Sourcecodes/config.in
kconfiglib中的
print_tree.py
示例:# Prints a tree of all items in the configuration
import kconfiglib
import sys
import os
os.chdir("/home/fedor/BR1311")
retval = os.getcwd()
print "Directory changed successfully %s" % retval
def print_with_indent(s, indent):
print (" " * indent) + s
def print_items(items, indent):
for item in items:
if item.is_symbol():
print_with_indent("config {0}".format(item.get_name()), indent)
elif item.is_menu():
print_with_indent('menu "{0}"'.format(item.get_title()), indent)
print_items(item.get_items(), indent + 2)
elif item.is_choice():
print_with_indent('choice', indent)
print_items(item.get_items(), indent + 2)
elif item.is_comment():
print_with_indent('comment "{0}"'.format(item.get_text()), indent)
conf = kconfiglib.Config(sys.argv[1])
print_items(conf.get_top_level_items(), 0)
config.in
menu "Audio and video applications"
config BR2_PACKAGE_WIPE
bool "wipe"
help
Wipe is a little command for securely erasing files
from magnetic media. It compiles under various unix platforms.
http://wipe.sourceforge.net
config BR2_PACKAGE_BONNIE
bool "bonnie++"
depends on BR2_INSTALL_LIBSTDCPP
depends on BR2_USE_MMU # fork()
help
Filesystem tester
http://www.coker.com.au/bonnie++/
comment "bonnie++ needs a toolchain w/ C++"
depends on BR2_USE_MMU
depends on !BR2_INSTALL_LIBSTDCPP
endmenu
source "b.in"
以及
b.in
(与config.in
完全相同,但最后缺少source
命令):menu "Audio and video applications"
config BR2_PACKAGE_WIPE
bool "wipe"
help
Wipe is a little command for securely erasing files
from magnetic media. It compiles under various unix platforms.
http://wipe.sourceforge.net
config BR2_PACKAGE_BONNIE
bool "bonnie++"
depends on BR2_INSTALL_LIBSTDCPP
depends on BR2_USE_MMU # fork()
help
Filesystem tester
http://www.coker.com.au/bonnie++/
comment "bonnie++ needs a toolchain w/ C++"
depends on BR2_USE_MMU
depends on !BR2_INSTALL_LIBSTDCPP
endmenu
最佳答案
在您发布的错误消息中,答案是正确的:
Perhaps base_dir (argument to Config.__init__(), currently "$srctree")
is set to the wrong value.
查看github上的source,
__init__
类的Config
接受多个参数,都是默认值。def __init__(self,
filename = "Kconfig",
base_dir = "$srctree",
print_warnings = True,
print_undef_assign = False):
…在类的docstring中,解释了
base_dir
参数:base_dir (default: "$srctree") -- The base directory relative to which
'source' statements within Kconfig files will work. For the
Linux kernel this should be the top-level directory of the
kernel tree. $-references to environment variables will be
expanded.
The environment variable 'srctree' is set by the Linux makefiles
to the top-level kernel directory. A default of "." would not
work if an alternative build directory is used.
我怀疑如果你把
'/home/fedor/BR1311'
传递给这个__init__
而不是改变它,比如:conf = kconfiglib.Config(sys.argv[1], '/home/fedor/BR1311')
事情会好得多。
关于python - 为什么Python不使用工作目录以及如何对其进行修复?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23758052/