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()
老实说,我不知道它为什么有效,但它确实有效。
谢谢你的想法。:)