setup的data_files参数采用以下格式输入:
setup(...
data_files = [(target_directory, [list of files to be put there])]
....)
有没有办法让我指定整个数据目录,所以我不必单独命名每个文件并在我更改项目实现时更新它?
我尝试使用os.listdir()
,但我不知道如何使用相对路径执行此操作,我无法使用os.getcwd()
或os.realpath(__file__)
,因为这些不指向我的存储库根目录正确。
答案 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()
。