首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取os.walk命中abspath

获取os.walk命中abspath
EN

Stack Overflow用户
提问于 2019-09-17 03:09:44
回答 5查看 64关注 0票数 1

我正在尝试在一个foldersystem中找到几个带有os.walk()'my_file.bat',如果文件名匹配,应该用subprocess.call().run()调用它。问题是os.path.abspath('my_file.bat')返回了一个联合'where\i\ran\the\script\from' + ˇmy_file.batˇ

谁能告诉我为什么会发生这种情况,我怎样才能得到'my_file.bat'的位置?

代码语言:javascript
复制
import os
import subprocess

for root, dir, name in os.walk(r'C:\the\path\i\am\using\for\the\folder\system'):
    for filename in name:
        if filename == 'my_file.bat':
            my_file_path = os.path.abspath('my_file.bat')
            os.chdir(my_file_path)
            subprocess.call('my_file.bat')
EN

回答 5

Stack Overflow用户

发布于 2019-09-17 03:13:59

abspath不会帮你,因为它是从当前目录计算路径的。abspath如何知道walk正在做什么?

除了os.chdir(my_file_path)尝试使用文件作为参数来更改目录之外...好吧,最好永远不要在python脚本中使用chdir

我怎么才能找到'my_file.bat‘的位置呢?

您不需要它(并且它不足以执行该文件)。您希望执行的是将当前目录设置为脚本所在目录的文件(使.bat文件更简单)

另一方面,root变量提供文件所在的目录。所以我会像这样重写你的代码:

代码语言:javascript
复制
for root, dir, name in os.walk(r'C:\the\path\i\am\using\for\the\folder\system'):
    for filename in name:
        if filename.lower() == 'my_file.bat':
            subprocess.call('my_file.bat',shell=True,cwd=root)

添加cwd=root允许call在执行之前(并且仅在调用中)将目录更改为脚本目录,而shell=True (您的下一个问题)确保您可以从subprocess.call调用脚本(而不是真正的可执行文件

如果文件名为MY_FILE.BAT,也要使用小写比较。对于所有这些怪癖,你必须喜欢窗户。

票数 2
EN

Stack Overflow用户

发布于 2019-09-17 03:21:01

最好使用pathlib,它使for循环变得更容易:

代码语言:javascript
复制
from pathlib import Path
import subprocess

root = Path(r'C:\the\path\i\am\using\for\the\folder\system')
for filename in root.rglob('my_file.bat')
    subprocess.call(filename.name, cwd=filename.parent)
票数 2
EN

Stack Overflow用户

发布于 2019-09-17 03:14:08

要获取通过os.walk获得的文件的路径,请使用os.path.join连接rootfilename

代码语言:javascript
复制
my_file_path = os.path.join(root, 'my_file.bat')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57963054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档