Python 获取os.walk路径

Python 获取os.walk路径,python,os.walk,os.path,Python,Os.walk,Os.path,我试图在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'位置 import os import subprocess for root, di

我试图在
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'
位置

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')

abspath
对您没有帮助,因为它从当前目录计算路径。
abspath
如何知道
walk
正在做什么

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

如何获取“my_file.bat”位置

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')
您不需要这样做(并且它不足以执行该文件)。您需要执行的是将当前目录设置为脚本目录的文件(使.bat文件更简单)

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

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
(您的下一个问题)确保可以从
子进程调用脚本(不是真正的可执行文件)。call


如果文件名为
MY_file.BAT
,也可以使用小写比较。你必须喜欢windows的所有这些怪癖。

abspath
对你没有帮助,因为它从当前目录计算路径。
abspath
如何知道
walk
正在做什么

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

如何获取“my_file.bat”位置

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')
您不需要这样做(并且它不足以执行该文件)。您需要执行的是将当前目录设置为脚本目录的文件(使.bat文件更简单)

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

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
(您的下一个问题)确保可以从
子进程调用脚本(不是真正的可执行文件)。call


如果文件名为
MY_file.BAT
,也可以使用小写比较。你必须热爱windows的所有这些怪癖。

要获得通过
os.walk
获得的文件路径,请使用
os.path.join
加入
根目录和
文件名

my_file_path = os.path.join(root, 'my_file.bat')

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

my_file_path = os.path.join(root, 'my_file.bat')

您应该能够通过以下方式获取文件的路径:

my_file_path = root+"\\"+filename

获取错误位置的原因是,python在使用
os.path.abspath()

时返回当前文件夹位置,并使用名称。您应该能够使用以下命令获取文件的路径:

my_file_path = root+"\\"+filename

获取错误位置的原因是,python在使用
os.path.abspath()

时返回了当前文件夹位置的名称,因此更好地使用
pathlib
,这使得for循环更加容易:

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)

更好地使用
pathlib
,这使得for循环更容易:

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)

所以我的解决方案花了一些时间,但这对我来说很有效:

batchFileFullPath=os.path.join(batchFileLocation'my_bat_file.bat')

p=subprocess.Popen(os.path.abspath(batchFileFullPath),stdin=subprocess.PIPE, cwd=batchFileLocation)stdout,stderr=p.communicate()

老实说,我不知道它为什么有效,但它确实有效。
谢谢你的想法。:)

所以我的解决方案花了一些时间,但这对我很有效:

batchFileFullPath=os.path.join(batchFileLocation'my_bat_file.bat')

p=subprocess.Popen(os.path.abspath(batchFileFullPath),stdin=subprocess.PIPE, cwd=batchFileLocation)stdout,stderr=p.communicate()

老实说,我不知道它为什么有效,但它确实有效。 谢谢你的想法。:)