在python setup.py data_files中包含整个目录

时间:2015-01-07 22:25:18

标签: python setup.py

setup的data_files参数采用以下格式输入:

setup(...
    data_files = [(target_directory, [list of files to be put there])]
    ....)

有没有办法让我指定整个数据目录,所以我不必单独命名每个文件并在我更改项目实现时更新它?

我尝试使用os.listdir(),但我不知道如何使用相对路径执行此操作,我无法使用os.getcwd()os.realpath(__file__),因为这些不指向我的存储库根目录正确。

4 个答案:

答案 0 :(得分:2)

import glob

for filename in glob.iglob('inner_dir/**/*', recursive=True):
    print (filename)

执行此操作,您将直接获得与当前目录相关的文件列表。

答案 1 :(得分:1)

  

我不知道如何使用相对路径

您需要先获取目录的路径,所以......

假设你有这个目录结构:

cur_directory
|- setup.py
|- inner_dir
   |- file2.py

要获取当前文件的目录(在本例中为setup.py),请使用:

cur_directory_path = os.path.abspath(os.path.dirname(__file__))

然后,要获取相对于current_directory的目录路径,只需加入其他一些目录,例如:

inner_dir_path = os.path.join(cur_directory_path, 'inner_dir')

如果您想提升目录,只需使用“..”,例如:

parent_dir_path = os.path.join(current_directory, '..')

一旦你有了这条路,就可以os.listdir

为了完整性:

如果您想要文件的路径,在这种情况下“file2.py”相对于setup.py,您可以这样做:

file2_path = os.path.join(cur_directory_path, 'inner_dir', 'file2.py') 

答案 2 :(得分:1)

karelv有一个正确的主意,但可以更直接地回答上述问题:

from glob import glob

setup(
    #...
    data_files = [
        ('target_directory_1', glob('source_dir/**')),
        ('target_directory_2', glob('nested_source_dir/**/*', recursive=True)),
        # etc...
    ],
    #...
)

答案 3 :(得分:0)

对于包含嵌套子目录的目录,我遇到了同样的问题。 glob 解决方案不起作用,因为它们会将目录包含在列表中,该设置会爆炸,并且在我排除匹配目录的情况下,它仍然将它们全部转储到同一目录中,这不是我想要的, 任何一个。我最终还是选择了 os.walk()

def generate_data_files():
    data_files = []
    data_dirs = ('data', 'plugins')
    for path, dirs, files in chain.from_iterable(os.walk(data_dir) for data_dir in data_dirs):
        install_dir = os.path.join(sys.prefix, 'share/<my-app>/' + path)    
        list_entry = (install_dir, [os.path.join(path, f) for f in files if not f.startswith('.')])
        data_files.append(list_entry)

    return data_files

然后在 data_files=generate_data_files() 块中设置 setup()