2016-02-28 2700 views
0

我正在构建一个可以自动执行系统管理员类型任务的python实用程序。部分工具涉及编写脚本,然后使用python界面中的powershell调用它们。这种代码的一个例子是这样的:Python - os.system调用中的相对路径

def remote_ps_session(): 
    target = raw_input("Enter your target hostname: ") 
    print "Creating target.ps1 file to establish connection" 
    pstarget = open("pstarget.ps1", "w") 
    pstarget.write("$target = New-Pssession " + target + "\n") 
    pstarget.write("Enter-PSSession $target" + "\n") 
    pstarget.close() 
    print "File created. Initiating Connection to remote host..." 
    os.system("powershell -noexit -ExecutionPolicy Unrestricted " + "C:\path\to\my\file\pstarget.ps1") 

我希望做两件事情,我认为可以用同样的方法来回答,我只是还没有搞清楚什么是最好的(进口VS变量VS初始设置定义等)

为了简单起见,我们会说的效用是在C:\实用程序和PowerShell函数是在一个文件夹的功能更深一层:C:\程序\功能

我想能够为1)脚本(被写入的文件)保存到的位置指定位置,然后2)在执行os.system调用时指向该位置。我希望这可以在大多数/任何现代Windows系统上运行。

我对可能性的想法是:

  1. 当脚本启动获取当前目录中,并且保存为一个变量,如果我需要回到一个目录中采取的变量,并在最后\删除一切,等等。看起来并不理想。
  2. 第一次启动系统位置的文件提示以输入变量。例如让它提示'你想要你的日志文件在哪里?' '你想要你的输出文件在哪里?' '你想在哪里生成脚本?'这些可以被称为变量,但如果它们移动了文件夹就会中断,并且可能不容易为用户“修复”。
  3. 我想有一种方法可以引用当前目录并导航到.. \ parallel文件夹到我正在执行的目录。 .... \ 2文件夹,但也似乎可能是混乱。我还没有看到管理这个标准/最佳实践是什么。

编辑:根据一些评论我认为__file__可能是开始寻找的地方。我将深入研究这一些,但任何例子(例如:__file__/subfoldername或任何使用会很酷。

+0

'os.system'使用'cmd.exe'(除非你改变%comspec%),但你有powershell脚本。你为什么用这个而不是'subprocess'?你的例子有一个'''在其中的路径 - 确保你使用一个原始字符串,或者反斜杠,或者使用正斜杠作为目录分隔符。 – cdarke

+0

@cdarke我只是最近才发现了关于子进程的问题,并且当我希望将输出返回到python会话中时,它已经合并了它。现在,我的大多数模块(可惜)都使用cmd.exe来为脚本调用powershell,如上所述。令人惊讶的是,上面的路径确实有效(不是确切的路径,而是那种格式)。但我会将它们切换为正斜杠。谢谢(你的)信息。 – Abraxas

+1

'subprocess.check_call'适用于不需要捕获输出的情况。 –

回答

1

Python有一个专用于路径操作os.path,所以任何时候你需要文件系统路径操作采取。一看它

至于你的具体问题,运行下面的例子,就看你如何使用此lib中的功能:

test.py

import os 
# These two should basicly be the same, 
# but `realpath` resolves symlinks 
this_file_absolute_path = os.path.abspath(__file__) 
this_file_absolute_path1 = os.path.realpath(__file__) 
print(this_file_absolute_path) 
print(this_file_absolute_path1) 
this_files_directory_absolute_path = os.path.dirname(this_file_absolute_path) 
print(this_files_directory_absolute_path) 
other_script_file_relative_path = "functions/some.ps" 
print(other_script_file_relative_path) 
other_script_file_absolute_path = os.path.join(this_files_directory_absolute_path, 
               other_script_file_relative_path) 
print(other_script_file_absolute_path) 
print("powershell -noexit -ExecutionPolicy Unrestricted %s" % 
     other_script_file_absolute_path) 

你应该得到输出与此类似:

/proj/test_folder/test.py 
/home/user/projects/test_folder/test.py 
/proj/test_folder 
functions/some.ps 
/proj/test_folder/functions/some.ps 
powershell -noexit -ExecutionPolicy Unrestricted /proj/test_folder/functions/some.ps