Python-附加的“;“成员”;传递给函数时附加到JSON对象

Python-附加的“;“成员”;传递给函数时附加到JSON对象,python,json,python-3.x,python-2.7,typeerror,Python,Json,Python 3.x,Python 2.7,Typeerror,我在自己的名为build.JSON的文件中有以下JSON对象: { "name": "utils", "version": "1.0.0", "includes": [], "libraries": [], "testLibraries": [] } 我在Python程序中使用以下方法获取此对象: def getPackage(packageName): jsonFilePath = os.path.join(SRCDIR, packageNam

我在自己的名为build.JSON的文件中有以下JSON对象:

{
    "name": "utils",
    "version": "1.0.0",
    "includes": [],
    "libraries": [],
    "testLibraries": []
}
我在Python程序中使用以下方法获取此对象:

def getPackage(packageName):
    jsonFilePath = os.path.join(SRCDIR, packageName, "build.json")
    packageJson = None
    try:
        with open(jsonFilePath, "r") as jsonFile:
            packageJson = json.load(jsonFile)
    except:
        return None
    return packageJson
我验证当前包的JSON对象(这是我正在迭代的许多包之一)在以下方法中没有返回。请注意,我正在临时打印字典的键:

def compileAllPackages():
    global COMPILED_PACKAGES

    for packageName in os.listdir(SRCDIR):
        package = getPackage(packageName)
        if package == None:
            continue

        # TEMP ==============
        for i in package:
            print(i)
        # ===================

        compiledSuccessfully = compilePackage(package)
        if not compiledSuccessfully:
            return False
    return True
最后,在compilePackage函数中收到字典后,我目前也在打印字典的键:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
compileAllPackages函数的输出:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
compilePackage函数的输出:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
我一辈子都搞不清楚在函数调用期间我的字典发生了什么???请注意build.json文件位于名为“utils”的目录中

编辑: Python脚本独立于build.json文件,在绝对路径上工作。还应该注意的是,在获得奇怪的输出后,我在稍后尝试访问有效密钥时也会遇到以下异常(似乎认为字典是字符串?…):

回溯(最近一次呼叫最后一次):
文件“/Users/nate/bin/BuildTool/unix/build.py”,第493行,在
main()
文件“/Users/nate/bin/BuildTool/unix/build.py”,第481行,在main中
compiledSuccessfully=compileAllPackages()
文件“/Users/nate/bin/BuildTool/unix/build.py”,第263行,在compileAllPackages中
compiledSuccessfully=compilePackage(包)
文件“/Users/nate/bin/BuildTool/unix/build.py”,第287行,在compilePackage中
compiledSuccessfully=compilePackage(包括)
文件“/Users/nate/bin/BuildTool/unix/build.py”,第279行,在compilePackage中
includes=getPackageIncludes(包)
文件“/Users/nate/bin/BuildTool/unix/build.py”,第194行,在getPackageIncludes中
includes=[package[“name”]#包始终包含自身
TypeError:字符串索引必须是整数

Edit:如果我将参数名称更改为“package”以外的其他名称,我以后就不会再得到奇怪的输出或异常。然而,这并不一定是一个修复,因为我不知道“package”这个名称会有什么问题。也没有这样命名的全局变量。

我尝试了您的代码,结果如下

├── test.py
└── tt
    └── cc
        └── utils
            └── build.json
compileAllPackages函数的输出:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
compilePackage函数的输出:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
我的目录结构是这样的

├── test.py
└── tt
    └── cc
        └── utils
            └── build.json

我认为您的代码是正确的,应该是您传递的路径参数不正确。

我尝试了您的代码,结果如下

├── test.py
└── tt
    └── cc
        └── utils
            └── build.json
compileAllPackages函数的输出:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
compilePackage函数的输出:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
u
t
i
l
s
name
version
includes
libraries
testLibraries
name
version
includes
libraries
testLibraries
我的目录结构是这样的

├── test.py
└── tt
    └── cc
        └── utils
            └── build.json

我认为您的代码是正确的,应该是您传递的path参数不正确。

答案非常愚蠢。由于包可能依赖的任何依赖关系,compilePackage()有可能被递归调用。在对函数的递归调用中,我向函数传递的是一个字符串,而不是一个字典。

结果是答案非常愚蠢。由于包可能依赖的任何依赖关系,compilePackage()有可能被递归调用。在对函数的递归调用中,我向函数传递的是字符串而不是字典。

我使用@benediktwerner。我不认为“utils”部分来自代码中的任何地方。尝试搜索代码中打印的所有其他点,看看是否来自其中一个点。更好的方法是,在for循环之前和之后打印一些东西,比如说
。\35;。然后,如果我在compilePackage函数中只允许一个打印循环,结果如上图所示。我也不相信打印缓冲区中有任何东西以前没有刷新过。您是否尝试过
print(package)
,看看您得到了什么?@Idlehands是的。如果我用上面的print(package)替换每个循环打印,从CompileAllPackage,我得到:
{'name':'utils','version':'1.0.0','includes':[],'libraries':[],'testLibraries':[]
从compilePackage,我得到(仍然在末尾加上奇怪的utils字符串):
{'name':'utils','version':'1.0.0','includes':[]“,”库“:[],”测试库“:[]}utils
我是@benediktwerner的。我不认为“utils”部分来自代码中的任何地方。尝试搜索代码中打印的所有其他点,看看是否来自其中一个点。更好的方法是,在for循环之前和之后打印一些东西,比如说
。\35;。然后,如果我在compilePackage函数中只允许一个打印循环,结果如上图所示。我也不相信打印缓冲区中有任何东西以前没有刷新过。您是否尝试过
print(package)
,看看您得到了什么?@Idlehands是的。如果我用上面的print(package)替换每个循环打印,从CompileAllPackage,我得到:
{'name':'utils','version':'1.0.0','includes':[],'libraries':[],'testLibraries':[]
从compilePackage,我得到(仍然在末尾加上奇怪的utils字符串):
{'name':'utils','version':'1.0.0','includes':[],'libraries':[],'testLibraries':[]}utils
应该是您传递的路径参数不正确
。这并不能解释为什么相同的代码段会有不同的输出。这不是答案,必须作为注释发布。
应该是您传递的路径参数不正确。
。这是d