不能连接' str'和'文件'对象:Python错误

时间:2015-07-09 23:02:00

标签: python

我有

以下代码:

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的新手。在我出错的地方有人可以帮忙吗?

3 个答案:

答案 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 :
    ...

这可能有用,虽然它很简陋,你可能有更好的选择可以使用其余的代码(我们不知道)。

请参阅How do you use subprocess.check_output() in Python?

答案 2 :(得分:0)

我想我理解,这是我会尝试的:

import os

D = os.getcwd()           # returns a string
newD = (D + '/folder/')   # concatenates the two strings together

我一直都在使用这个,如果os.getcwd()(获取当前工作目录)并不是你想要的,那么os模块下也有类似的选项,它们也会返回一个字符串。我相信你知道,在IDLE中键入help(os)应该会显示所有选项。