0

我正在使用以下命令从 Microsoft Access VBA 成功运行我的 Python 脚本:

Shell (CurrentProject.Path & "\Python\Python-Portable.exe " & CurrentProject.Path & "\Python\scripts\convert.py")

当 Python 脚本运行时,csv 输出被放置在我的 Windows 主目录中。这是 convert.py 的 Python 源代码:

#!/usr/bin/python
import sys, os
from openpyxl.reader.excel import load_workbook

def main():
    wb=load_workbook(filename='list.xlsx')  
    for sheet in wb.worksheets:
        csv_file='%s.csv' % sheet.title
        print 'Creating %s' % csv_file
        fd=open(csv_file, 'wt')
        for row in sheet.rows:
            values=[]
            for cell in row:
                value=cell.value
                if value is None:
                    value=''
                if not isinstance(value, unicode):
                    value=unicode(value)
                value=value.encode('utf8')
                values.append(value)
            fd.write('\t'.join(values))
            fd.write('\n')
        fd.close()

if __name__=='__main__':
    main()

我希望将 CSV 文件放入“CurrentProject.Path & “\Python\scripts\”。关于为什么 Access VBA 将我的输出放入我的 Windows 主目录的任何建议?

谢谢

4

1 回答 1

3

Shell函数不保证它运行的程序有任何特定的工作目录——事实上,我相信它使用默认 shell 的任何默认值,这往往意味着你在新 Windows 上的主目录和在旧 Windows 上完全没用的地方.

当您指定像这样的裸文件名'mysheet.csv'(或像 的相对路径名r'foo\mysheet.csv')时,Python 将使用当前工作目录来决定将其放在哪里。

因此,您的 VBA 脚本必须cd在运行程序之前显式说明,或者更简单地说,您的 Python 脚本必须显式地将文件放在正确的位置。


例如,如果您希望文件在脚本文件本身旁边结束(这是一件很奇怪的事情,但这似乎是您所要求的):

import sys, os

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

# ... later ...

fd=open(os.path.join(scriptdir, csv_file), 'wt')

或者,您可能希望这样做,以便 VB 脚本可以将输出目录作为参数传递:

fd = open(os.path.join(sys.argv[1], csv_file), 'wt')

然后:

Shell (CurrentProject.Path & "\Python\Python-Portable.exe " & 
       CurrentProject.Path & "\Python\scripts\convert.py " & 
       CurrentProject.Path & "\Python\scripts")
于 2013-10-09T21:11:34.347 回答