我有
以下代码:
for src_filename, src_code in src_dict.iteritems():
try:
set.dependencies = subprocess.check_output('unifdef -s /home/c/maindir/folder/' +src_filename, shell=True)
except subprocess.CalledProcessError, e:
print "code is bad" +set.property
set.bad = 1
raise
set.dependencies = list(set(set.dependencies.splitlines()))
我想解开路径的硬编码 所以我写了下面这段代码:
filepath = os.path.join(maindirpath, "folder/")
maindir是这里的论点:/ home / c / maindir
path = open(filepath)
set.dependencies = subprocess.check_output("unifdef" '-s' path +src_filename, shell=True)
它抛出以下错误:
TypeError: cannot concatenate 'str' and 'file' objects
我是python的新手。在我出错的地方有人可以帮忙吗?
答案 0 :(得分:1)
for src_file, src_code in src_dict.iteritems():
# assuming, here, that you want to honor the handle's path if already given
filename = src_file.name
if not '/' in filename:
filename = os.path.join(filepath, filename)
try:
set.dependencies = subprocess.check_output(['unifdef', '-s', filename])
except subprocess.CalledProcessError:
pass # etc.
顺便说一下,set
是一个错误的变量名,因为set
也是一个Python数据类型;您通过使用类似命名的变量对数据类型进行遮蔽,从而使数据类型无法在代码中使用。不要那样做!
答案 1 :(得分:0)
您正在尝试连接'unifdef -s /home/c/maindir/folder/'
与src_filename
第一个是字符串,所以第二个可能是文件对象。
根据您编辑的版本,您可能需要
bytestr = subprocess.check_output( [ 'unifdef', '-s', filepath + os.path.basename(src_filename.name) ] )
而不是
set.dependencies = subprocess.check_output("unifdef" '-s' path +src_filename, shell=True)
(请记住subprocess.check_output
returns a byte string)。
然后将bytestr
分配给您需要的任何内容。
你甚至可能想要
try :
bytestr = subprocess.check_output( [ 'unifdef', '-s', filepath + os.path.basename(src_filename.name) ], stderr=subprocess.STDOUT )
except subprocess.CalledProcessError :
...
这可能有用,虽然它很简陋,你可能有更好的选择可以使用其余的代码(我们不知道)。
答案 2 :(得分:0)
我想我理解,这是我会尝试的:
import os
D = os.getcwd() # returns a string
newD = (D + '/folder/') # concatenates the two strings together
我一直都在使用这个,如果os.getcwd()(获取当前工作目录)并不是你想要的,那么os模块下也有类似的选项,它们也会返回一个字符串。我相信你知道,在IDLE中键入help(os)应该会显示所有选项。